请教一个关于 mysql 优化的问题

2022-04-08 16:39:12 +08:00
 proletarius

select a,b,c,d from ae left join ap on ae.anomaly_process_id = ap.id join af on ae.anomaly_file_id = af.id or ap.anomaly_file_id = af.id join p on ae.product_id = p.id join d on d.id = ae.device_id join dv on dv.product_id = ae.product_id join mv on dv.management_view_id = mv.id join dvr on dv.id = dvr.device_view_id join au on dv.user_id = au.id join t on t.id = au.tenant_id union all select a,b,c,d from ae left join ap on ae.anomaly_process_id = ap.id join af on ae.anomaly_file_id = af.id or ap.anomaly_file_id = af.id join p on ae.product_id = p.id join d on d.id = ae.device_id join dv on dv.product_id = ae.product_id join au on dv.user_id = au.id join t on t.id = au.tenant_id

每个子查询单独查询速度很快,但是用了 union all 之后速度慢到需要几十秒,数据也就十几万条,请教一下到底从哪里开始优化比较好?是更改表的数据结构减少 join 还是在业务数据库中分开查询两次做合并

1191 次点击
所在节点    MySQL
4 条回复
CEBBCAT
2022-04-08 16:41:58 +08:00
贴代码可以用 gist

建表语句和 SHOW INDEX 贴一下
proletarius
2022-04-08 17:07:49 +08:00
<script src="https://gist.github.com/Proletarier/54dd258c09f94c5e559863de6ed8121d.js"></script>

已补充,因为涉及的表结构太多,只能简单复述一下 ,每个字段都需要引用的字段都单独建立了索引,目前感觉影响速度的地方有两个 一个是 union all 还有一个就是 or 的用法导致索引失效 Range checked for each record (index map: 0x1),
proletarius
2022-04-08 17:08:22 +08:00
asmile1993
2022-04-08 17:19:45 +08:00
你不贴表结构、执行计划,没人会去看的,只是浪费时间而已

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

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

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

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

© 2021 V2EX