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 还是在业务数据库中分开查询两次做合并
1
CEBBCAT 2022-04-08 16:41:58 +08:00
贴代码可以用 gist
建表语句和 SHOW INDEX 贴一下 |
2
proletarius OP <script src="https://gist.github.com/Proletarier/54dd258c09f94c5e559863de6ed8121d.js"></script>
已补充,因为涉及的表结构太多,只能简单复述一下 ,每个字段都需要引用的字段都单独建立了索引,目前感觉影响速度的地方有两个 一个是 union all 还有一个就是 or 的用法导致索引失效 Range checked for each record (index map: 0x1), |
3
proletarius OP |
4
asmile1993 2022-04-08 17:19:45 +08:00
你不贴表结构、执行计划,没人会去看的,只是浪费时间而已
|