[英]MySql query plan chooses index with fewer rows to check but execution is much slower
我有一個簡單的查詢-它只查看一個表,並且有2列可供選擇以建立索引,一個ErrorTypeId(指向約20個唯一值的查找表)和DateOccurred(一個datetime列,其中可以有任何日期) 。
在大多數情況下,這很好,但是在某些情況下查詢將超時。 對其進行調查,所選擇的索引(ErrorTypeId)在計划中的行比其他索引(DateOccurred)少,但是由於某種原因,與我手動強制它使用其他索引相比,它需要更長的運行時間。
/* This execution plan has fewer rows than the second one - and as a result this is
* the one chosen. But it is much much slower.
*/
EXPLAIN
SELECT * FROM my_log_table
WHERE DateOccurred BETWEEN '2013-06-11 00:00:00' AND '2013-06-22 00:00:00' AND ErrorTypeId = 4
ORDER BY DateOccurred DESC
LIMIT 1000;
/* Many more rows - but much much quicker to execute.
* Is it the spread of data across pages? Is there a
* way other than USE/FORCE INDEX to improve execution plan?
*/
EXPLAIN
SELECT * FROM my_log_table USE INDEX (DateOccurred_Index)
WHERE DateOccurred BETWEEN '2013-06-11 00:00:00' AND '2013-06-22 00:00:00' AND ErrorTypeId = 4
ORDER BY DateOccurred DESC
LIMIT 1000;
當有更多行要查看時,為什么第二個查詢更快?
有沒有一種方法可以幫助MySql在不使用USE / FORCE索引的情況下選擇更快的索引?
查詢緩慢的原因是索引編制效率低下。
在(ErrorTypeId, DateOccurred)
上添加一個復合索引,您將不需要任何強制或提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.