为什么我不能在我已经为其建立索引的MySQL查询中删除filesort

为什么我不能在我已经为其建立索引的MySQL查询中删除filesort,mysql,indexing,range,filesort,Mysql,Indexing,Range,Filesort,我有一个具有以下模式的表 Id,INT,主键 QueryId,INT CreatedTime、DateTime 我创建了复合索引queryid,CreatedTime 我跑的时候怎么会这样 解释通过createdtime desc按1,6的顺序从测试中选择*查询ID 我仍然得到以下文件,其中包含文件排序?知道如何删除文件排序吗? 在何处使用;使用文件排序 实际上,您还没有构建可用于该查询的索引 索引只能用于从最左边的列向右查找和排序。一旦遇到不有用的内容,索引的其余部分就会被忽略 您没有发布解释

我有一个具有以下模式的表

Id,INT,主键

QueryId,INT

CreatedTime、DateTime

我创建了复合索引queryid,CreatedTime

我跑的时候怎么会这样 解释通过createdtime desc按1,6的顺序从测试中选择*查询ID

我仍然得到以下文件,其中包含文件排序?知道如何删除文件排序吗? 在何处使用;使用文件排序


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

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

您没有发布解释的输出,但我怀疑如果正在检查索引,并且QueryId是INT,您会发现Key_len=4,这意味着只有最左边的4字节QueryId对优化器有用

QueryId上的索引CreatedTime,用于按QueryId提取记录,并按CreatedTime对记录进行排序,当且仅当您为QueryId选择单个值时。执行此操作时,索引将返回与该QueryId匹配的行,这些行已按CreatedTime排序,优化器将实现这一点

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

CreatedTime上的索引QueryId也不会有帮助,因为QueryId不在左侧,除非有非常少的行,否则服务器可以提取按CreatedTime预先排序的行,但它必须扫描所有行以找到QueryId的匹配值


简而言之,对于这样的查询,您无法完全建立索引,而且使用filesort也不是总能避免的

MySQL的Optimizer已经确定对文件进行排序比遍历该查询的索引更快。如果查询不同,或者表中的行数不同,MySQL可能会选择执行其他操作。让它做它的工作吧——它几乎肯定比你或我做得更好。嗨,迈克尔,我在原始问题中添加了解释结果图像,请看一看。我在网上找到了几个和我情况相同的地方,他们使用了和我一样的方法,并声称生效