我正在尝试使用EXPLAIN优化我的MySQL查询。这是一个非常简单的查询示例:
SELECT ID, Date, SenderID, Message FROM messages WHERE ReceiverID = '1000' ORDER BY ID DESC LIMIT 25;
当我查看EXPLAIN时显示:
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------------+
| 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 |
+----+-------------+-----------+------+---------------+------------+---------+-------+------+-----------------------------+
结果数 15 。我已经为 ReceiverID 创建了一个索引,所以我不明白为什么EXPLAIN中的'rows'显示 34 ?我也不知道为什么它使用filesort。这个查询速度非常慢,但其他结果较大的查询往往很慢,“行”数字似乎几乎是我预期的两倍......
它可能非常直接但我必须遗漏一些东西?
答案 0 :(得分: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()?