为简单的 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
我已经在 active
、season_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。
我正在尝试从一个简单的 MySQL 查询中删除文件排序。
table 的列 active
是 0 或 1,还有一个列 season_average
是整数,没有连接。
我的select声明如下:
SELECT
*
FROM `group` WHERE active=1
ORDER BY season_average DESC
我已经在 active
、season_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。