2013-02-04 39 views
2

使用MySQL(66年5月1日)解釋說,雖然「慢日誌」報道整個表進行掃描,將掃描只需72行(Rows_examined:5476845) 這怎麼可能?我想不出有什麼不對查詢MySQL的解釋VS慢登錄

*name*是一個字符串唯一索引和 *date*只是一個普通的INT指數

這是從慢EXPLAIN EXPLAIN SELECT * FROM table WHERE name LIKE 'The%Query%' ORDER BY date DESC LIMIT 3;

 
id select_type table type possible_keys key  key_len ref  rows Extra 
1 SIMPLE  table index name   date 4  NULL 72  Using where 

輸出日誌

# Query_time: 5.545731 Lock_time: 0.000083 Rows_sent: 1 Rows_examined: 5476845 SET timestamp=1360007079; SELECT * FROM table WHERE name LIKE 'The%Query%' ORDER BY date DESC LIMIT 3;

回答

4

是從EXPLAIN返回rows值是一個估計,必須進行檢查,以找到符合您查詢的結果行數的

如果你看,你會發現爲查詢執行選擇的密鑰是date,這可能是因爲你的ORDER BY子句而被挑選出來的。因爲在查詢中使用的密鑰與您的WHERE子句無關,所以這可能就是爲什麼估計會變得混亂。即使你的WHERE子句在name列做LIKE,優化器可以決定完全不使用索引:

有時MySQL不使用索引,即使一個是可用的。一個 發生這種情況的情況是,當優化程序估計 使用該索引將要求MySQL訪問表中行的非常大的 百分比。 (在這種情況下,一臺掃描 可能是因爲它需要較少的目的要快得多。)source

總之,優化器選擇不使用name關鍵,儘管這將是一個這是要返回的行的限制因素。您可以嘗試forcing the index以查看是否改善了性能。

+0

感謝您的回覆。在'name'上使用FORCE INDEX可以使大多數查詢更快。但是我仍然需要'date'索引來確定索引是否太大而不能選擇最新的索引(例如,%很大,最後一個會使索引更快)。兩者都做一個FORCE INDEX使查詢儘可能慢沒有FORCE INDEX。 – MitziMeow