我有一個SQL查詢需要大量時間來評估,因爲它在一個非常大的數據集上運行。當試圖提高執行時間,我發現了以下工作:訂購空集時,SQL查詢變得非常慢
當執行下面的查詢MySQL服務器需要花費很多的時間(最多100secs)
SELECT some_data
FROM table
INNER JOIN anothertable
ON (table.value =
anothertable.value)
WHERE (table.parent = 56521
AND table.date >=
'2016-10-19 08:37:45.606947')
ORDER BY table.date DESC
LIMIT 1
所以我猜它的分開部該需要這麼多的執行時間和我手動移除以排序,看看在執行差異的查詢:
SELECT some_data
FROM table
INNER JOIN anothertable
ON (table.value =
anothertable.value)
WHERE (table.parent = 56521
AND table.date >=
'2016-10-19 08:37:45.606947')
LIMIT 1
上述查詢需要0.45秒,並導致空查詢集。
我得出的結論是,我的查詢在評估WHERE-Clause之前命令WHOLE數據集。我應該如何形成查詢以防止這種行爲?爲什麼會出現這種行爲?
這些都是解釋表的緩慢和快速查詢:
Slow
+----+-------------+-------+------------+--------+------------------------------------------+------------------+---------+------------------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+------------------------------------------+------------------+---------+------------------------------+------+----------+-------------+
| 1 | SIMPLE | A | NULL | index | PRIMARY,D4b797d14e515242e7251754c57b7701 | date | 5 | NULL | 1325 | 0.08 | Using where |
| 1 | SIMPLE | B | NULL | eq_ref | PRIMARY | PRIMARY | 4 | value | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+------------------------------------------+------------------+---------+------------------------------+------+----------+-------------+
Fast:
+----+-------------+-------+------------+--------+------------------------------------------+----------------------------------+---------+------------------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+------------------------------------------+----------------------------------+---------+------------------------------+------+----------+-------+
| 1 | SIMPLE | A | NULL | ref | PRIMARY,D4b797d14e515242e7251754c57b7701 | D4b797d14e515242e7251754c57b7701 | 4 | const | 5175 | 100.00 | NULL |
| 1 | SIMPLE | B | NULL | eq_ref | PRIMARY | PRIMARY | 4 | value | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+------------------------------------------+----------------------------------+---------+------------------------------+------+----------+-------+
大概,添加/刪除'ORDER BY ...'會導致執行計劃改變。你應該在兩種情況下嘗試'EXPLAIN SELECT ...',看看它有什麼不同。另外:table.parent,table.date,table.value和/或anothertable.value是否已編入索引? – Sasha
所有這三個字段都被編入索引。 –
另一種觀察:不是每次執行此查詢都會導致執行時間過長。一些是立即執行的,一些需要更多的時間 - 相同的查詢,父母/日期的不同值 –