为什么我无法摆脱已经构建索引的MySQL查询中的filesort

时间:2013-10-17 01:54:56

标签: mysql indexing range filesort

我有一个具有以下架构的表

Id ,INT,主键

QueryId ,INT

CreatedTime ,DateTime

我创建了复合索引(QueryId,CreatedTime)

我跑的时候怎么样 解释select * from test where queryid in(1,6)order by createdtime desc

我仍然得到以下有filesort?任何想法我怎么能删除filesort? “使用where;使用filesort”

Explain result

1 个答案:

答案 0 :(得分:1)

您实际上没有构建可用于该查询的索引。

索引只能用于查找和从最左边的列向右排序。只要遇到无用的内容,就会忽略索引的其余部分。

您没有发布EXPLAIN的输出,但我怀疑如果正在检查索引而且QueryId是INT,那么您会发现Key_len = 4含义只有最左边的4个字节(QueryId)才对优化器有用。

(QueryId,CreatedTime)用于通过QueryId提取记录的索引,当且仅当您为QueryId选择单个值时,才按CreatedTime对它们进行排序。执行此操作时,索引将返回与已由CreatedTime排序的QueryId匹配的行,优化程序会实现此目的。

相反,如果查找QueryId的多个值,索引返回的行将按QueryId排序,然后按每个QueryId组中的CreatedTime返回...因此需要进一步的filesort因为CreatedTime值基本上没有有用的顺序排序。如果您ORDER BY QueryId,CreatedTime,文件出口当然应该消失,但这可能不是您想要的。

(CreatedTime,QueryId)上的索引也无济于事,因为QueryId不在左边,除非行数非常少,否则服务器可以拉取CreatedTime预先排序的行,但它必须扫描所有行以查找QueryId的匹配值。

简而言之,您不能完全索引这样的查询,并且Using filesort不是一直可以避免的。