为简单的 MySQL 查询移除 "Using filesort"

Remove "Using filesort" for simple MySQL query

我正在尝试从一个简单的 MySQL 查询中删除文件排序。

table 的列 active 是 0 或 1,还有一个列 season_average 是整数,没有连接。

我的select声明如下:

SELECT 
*
FROM `group` WHERE active=1 
ORDER BY season_average DESC

我已经在 activeseason_average 上尝试了一个索引,在 (active, season_average)(season_average, active) None 上尝试了多个列,这些都解决了问题。

这个 SQL Fiddle 显示了我遇到的问题:http://sqlfiddle.com/#!9/77861/2

有办法解决这个问题吗?

Subrata Dey Pappu 的想法是正确的,他说用小样本集判断查询性能是查看查询性能的糟糕测试。在您的情况下,查询优化器确定对 5 行进行完整 table 扫描并使用 quicksort 对顺序进行排序比使用复合索引 (active, season_average) 更容易已经创建。 运行 解释计划证明了这一点:
它将可能的关键选择显示为 active_seasonAverage,但是没有 key 用于该小样本数据集。

虽然增加样本集大小会调整查询优化器访问数据的方式(如 Subrata Dey Pappu 在上面的评论中指出的那样),但您可以欺骗它(不建议将其硬编码到您的应用程序中)通过 运行 相同的查询,但像这样:

 SELECT 
*
FROM `group` force index (active_seasonAverage) WHERE active=1 
ORDER BY season_average DESC

这会强制查询优化器使用您的复合键,解释计划将如下所示:

注意 key 不是 NULL,而是使用 active_seasonAverage 而在 Extra 下没有 Using filesort.


此外,对于小数据集测试,请考虑 Mysql 手册页 How MySQL Uses Indexes 中的以下摘录:

Indexes are less important for queries on small tables, or big tables where report queries process most or all of the rows. When a query needs to access most of the rows, reading sequentially is faster than working through an index. Sequential reads minimize disk seeks, even if not all the rows are needed for the query.

因此,使用具有实际和大量数据集的各种索引执行测试,运行 您的测试通过 Explain