使用EXPLAIN优化MySQL查询

时间:2016-02-28 14:15:25

标签: mysql explain

我正在尝试使用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。这个查询速度非常慢,但其他结果较大的查询往往很慢,“行”数字似乎几乎是我预期的两倍......

它可能非常直接但我必须遗漏一些东西?

1 个答案:

答案 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()?