簡體   English   中英

MySql查詢計划選擇要檢查的行較少的索引,但執行速度慢得多

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM