我有一个具有以下架构的表
Id ,INT,主键
QueryId ,INT
CreatedTime ,DateTime
我创建了复合索引(QueryId,CreatedTime)
我跑的时候怎么样 解释select * from test where queryid in(1,6)order by createdtime desc
我仍然得到以下有filesort?任何想法我怎么能删除filesort? “使用where;使用filesort”
答案 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
不是一直可以避免的。