gpt4 book ai didi

mysql - 为什么我不能在我已经为其建立索引的 MySQL 查询中摆脱文件排序

转载 作者:可可西里 更新时间:2023-11-01 08:49:00 25 4
gpt4 key购买 nike

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

Id, INT, 主键

QueryId,整数

创建时间,日期时间

我创建了复合 index(QueryId, CreatedTime)

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

我仍然得到以下具有文件排序的信息?知道如何删除文件排序吗?“使用哪里;使用文件排序”

Explain result

最佳答案

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

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

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

(QueryId,CreatedTime) 上的索引按 QueryId 提取记录,当且仅当您为 QueryId 选择单个值时按 CreatedTime 对它们进行排序。当您这样做时,索引将返回与该 QueryId 匹配的行,这些行已经按 CreatedTime 排序,并且优化器会意识到这一点。

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

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

简而言之,您不能完全 为这样的查询建立索引,并且使用文件排序 并不是总能避免的事情。

关于mysql - 为什么我不能在我已经为其建立索引的 MySQL 查询中摆脱文件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19416987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com