2016-02-28 53 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