endeksler olmadan seçme sorgusu ile karşılaştırıldığında MySQL Güncelleme katılmak Aynı ipin ardışık sıraları arasındaki zaman farkı.son derece yavaş olarak bazı sunucu günlükleri yakalar 100k satırlarla MySQL tablo oluşturduk
AncakSELECT * FROM logs AS a
LEFT JOIN (
SELECT id,
from_unixtime(@diff) AS starttime,
date AS endtime,
IF(@diff = 0, 0, (unix_timestamp(date) - @diff)/60) AS session_time1,
@diff := unix_timestamp(date)
FROM logs,
(SELECT @diff := 0) AS x
ORDER BY ip, logs.date
) AS b ON
a.id = b.id
, bir önceki sorguyu kullanmaya çalıştığınızda zaman oturumu güncellemek için güncelleme birleşim, aşağıdaki güncelleştirme sorgusu: Ben bir saniyeden kısa sürer aşağıdaki seçme sorgusu ile ulaşmak mümkün duyuyorum 600 saniyeden fazla zaman alır:
UPDATE logs AS a
LEFT JOIN (
SELECT id,
from_unixtime(@diff) AS starttime,
date AS endtime,
IF(@diff = 0, 0, (unix_timestamp(date) - @diff)/60) AS session_time1,
@diff := unix_timestamp(date)
FROM logs,
(SELECT @diff := 0) AS x
ORDER BY ip, logs.date
) AS b ON
a.id = b.id
SET session_time = session_time1;
Neyi eksik?
Teşekkürler!
GÜNCELLEME: İşteselect
arasında EXPLAIN
geçerli:
+----+-------------+------------+--------+---------------+------+--------+
| id | select_type | table | type | possible_keys | key | rows |
+----+-------------+------------+--------+---------------+------+--------+
| 1 | PRIMARY | a | ALL | NULL | NULL | 109029 |
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | 108680 |
| 2 | DERIVED | <derived3> | system | NULL | NULL | 1 |
| 2 | DERIVED | logs | ALL | NULL | NULL | 109029 |
| 3 | DERIVED | NULL | NULL | NULL | NULL | NULL |
+----+-------------+------------+--------+---------------+------+--------+
'WHERE ip = '...''? 100k girişlerin tümünü güncellediğinizi, ancak seçtiğinizleri ("LEFT JOIN' = ilk gruptaki seçim kurallarına uymayan öğeler) güncellediğinizi görüyorsunuz. INNER JOIN' kullanmayı dene? –
Teşekkürler Alejandro, ama yorumunuzu tam olarak anlamıyorum. İç katılma neden daha iyi olur? 'Where' cümlesiyle ne demek istiyorsun? – kahlo
Üzgünüm, daha iyi açıklamalıydım. "UPDATE" kullandığınızda, hangi verilerin güncellenmesi gerektiğini filtrelemek için genellikle bir "WHERE" ifadesi kullanırsınız. Durumunuzda, belirli bir IP adresi için güncellemek istediğinizde, 'WHERE ip = ''' sadece o belirli IP ile verileri işlemek için daha iyi olmalıdır (sorgunuzun tablonuzdaki her kaydı işlediğini düşünüyorum) hepsi olmasa bile, güncellenir). –