我有一个具有以下架构的表
id,int,主键
内景奎里德
创建时间,日期时间
我创建了复合索引(queryid,createdTime)
为什么我跑的时候
解释按createdTime desc按(1,6)顺序从queryid中选择*的测试
我仍然得到下面的文件排序?知道如何删除文件排序吗?
“使用位置;使用文件排序”
最佳答案
实际上,您还没有构建可用于该查询的索引。
索引只能用于从最左边的列向右查找和排序。一旦遇到不有用的东西,索引的其余部分就会被忽略。
您没有发布EXPLAIN
的输出,但我怀疑,如果正在检查索引并且queryid是INT
,您将发现Key_len
=4,这意味着只有最左边的4字节(queryid)对优化器有用。
上的索引(queryid,createdtime),用于按queryid提取记录,并仅在为queryid选择单个值时按createdtime排序。当您这样做时,索引将返回与已按createdTime排序的queryid匹配的行,优化器将实现这一点。
相反,如果您查找queryid的多个值,则索引返回的行将按queryid排序,然后按每组queryid中的createdtime排序…因此需要进一步的文件排序,因为createdTime值本质上是按没有用的顺序排序的。如果您ORDER BY
queryid,createdtime,文件排序当然应该消失,但这可能不是您想要的。
上的索引(createdTime,queryID)也没有帮助,因为queryID不在左侧,除非有非常少的行,否则服务器可以提取按createdTime预先排序的行,但它必须扫描所有行才能找到queryID的匹配值。
简而言之,这样的查询不能完全索引,Using filesort
也不是总能避免的。