2016-02-28 46 views
1

我正在嘗試使用EXPLAIN優化我的MySQL查詢。這裏是一個非常簡單地查詢的示例:使用EXPLAIN優化MySQL查詢

SELECT ID, Date, SenderID, Message FROM messages WHERE ReceiverID = '1000' ORDER BY ID DESC LIMIT 25; 

當我觀看解釋它示出了:

+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra      | 
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------------+ 
| 1 | SIMPLE  | messages | ref | ReceiverID | ReceiverID | 5  | const | 34 | Using where; Using filesort | 
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------------+ 

結果數是。我創建了一個索引ReceiverID,所以我不明白爲什麼'行'在說明是顯示?我也不知道爲什麼它使用filesort。這個查詢不是非常緩慢,但其他查詢結果較大,趨於緩慢,'行'的數字似乎幾乎是我期望它的兩倍...

它可能是非常簡單的東西,但我必須失蹤什麼?

回答

0

filesort的含義是不能從索引完成排序。

欲瞭解更多信息,請閱讀這裏:https://www.percona.com/blog/2009/03/05/what-does-using-filesort-mean-in-mysql/

我建議索引應該跨越ReceiverID和id。

然後可以從索引單獨完成排序。

行數只是一個近似值。在執行查詢之前,您無法知道行數。欲瞭解更多信息,請看這裏:Why the rows returns by "explain" is not equal to count()?

+0

嗨大衛,謝謝你的建議。我認爲有ID作爲主鍵會這樣做,但我想我需要在相同的索引中有ReceiveID和ID。更大的擔憂是它必須檢查的行數。似乎太多了,但我會檢查出這個鏈接。謝謝 – Carlos88