【问题标题】:Remove "Using filesort" for simple MySQL query删除简单 MySQL 查询的“使用文件排序”
【发布时间】:2016-02-10 04:51:21
【问题描述】:

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

该表的列 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) 上尝试了多个列,但都没有解决问题。

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

有没有办法解决这个问题?

【问题讨论】:

  • 您无法在小数据集上判断查询的性能。用大量数据填充您的表,然后执行此查询。
  • 我对 92 条记录进行了查询,结果如下:id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE group ref active_seasonAverage active_seasonAverage 1 const 44 Using where

标签: mysql performance filesort


【解决方案1】:

Subrata Dey Pappu 的想法是正确的,他说用小样本集判断查询性能是不好的测试来查看查询性能。在您的情况下,查询优化器确定使用 quicksort 对 5 行进行全表扫描并排序顺序比使用您创建的复合索引 (active, season_average) 更容易。通过运行解释计划可以明显看出这一点:
其中将可能的键选择显示为active_seasonAverage,但是没有key 用于这么小的样本数据集。

虽然增加样本集大小将调整查询优化器访问数据的方式(如上面 cmets 中的 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 的摘录:

索引对于小表或大表的查询不太重要 报表查询处理大部分或所有行的位置。当一个查询 需要访问大部分行,顺序读取比 通过索引工作。顺序读取最小化磁盘寻道,甚至 如果查询不需要所有行。

因此,使用各种索引执行您的测试,并使用真实的大型数据集,通过Explain 运行您的测试。

【讨论】:

  • 感谢您的详细回复
  • 但是,它真的加快了查询速度吗? “删除文件排序”并不总能加快查询速度。
  • 你好奇瑞克是不是这样?导致 OP 问题是“如何删除简单查询的文件排序”...不是如果删除文件排序使查询更快...
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 2011-02-15
相关资源
最近更新 更多