求助一个排查了半年没解决的 MySQL order by 子句导致索引失效的问题, 500 多万条记录的小表要查快两分钟

183 天前
 drymonfidelia

打码的是查询中完全没用到的字段。

阿里云数据库,版本号是 5.7

是一个目前 500 多万条记录的小表。索引信息:

查询语句:

EXPLAIN 信息:

通过不断增删条件,确定导致索引失效的问题来自 order by 子句,删除 order by 可以正常索引。 实在不会数据库,请教一下怎么操作

看不清图可以右键放大

2077 次点击
所在节点    数据库
30 条回复
kxct
182 天前
使用子查询试试,c 表数据太少没必要走索引
drymonfidelia
182 天前
@LiaoMatt C 表只有 8 条,全表查询也不可能导致每个查询都要 2 分钟吧
LiaoMatt
182 天前
@drymonfidelia 8 * 500W 就是 4000 万了- -, 你可以试着把 join 的表去掉, 看看单表查询效率
drymonfidelia
181 天前
@8355 把联合查询删掉, 全站 504 Timeout, 还好是在半夜
drymonfidelia
181 天前
@8355 是 联合索引 ,打错了
8355
181 天前
当然是在测试环境测试啊 锅锅。。。 你直接干生产啊。
8355
181 天前
drymonfidelia
181 天前
@8355 测试环境只有几万条数据,不建索引都不卡
8355
181 天前
@drymonfidelia #28 在测试环境删掉索引不是为了测试 EXPLAIN 是否能命中索引嘛。。。 跟快不快又啥关系啊。。
c6h6benzene
178 天前
用电脑终于看到了全部的语句。

虽然可能影响不大,不过我习惯上会把关联条件写到 JOIN 那边,就是

FROM tbl_codes A
INNER JOIN tbl_packages B on A.PackageId = B.PackageId
INNER JOIN tbl_code_status C on A.CodeStatusId = C.CodeStatusId
INNER JOIN tbl_package_category D ON B.CategoryId = D.CategoryId
WHERE Archived = 0 AND UserId = [UserId]

ORDER BY 的话试试写 A.CodeId 看看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1036069

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX