SQL 描述:
DELETE a.*, b.*,c.*,d.*,e.*
FROM testa a
LEFT JOIN testb b
ON a.service = b.service LEFT JOIN test c ON b.service = c.service LEFT JOIN testd d ON c.service = d.servicename
LEFT JOIN testd e ON d.service = e.service
WHERE a.service="test";
SQL 的目的:多表相关数据删除。
首先看一下执行这条 SQL 当时的执行计划,这是测试库的数量级,数据量还比较小
不知道大家看出来啥问题没
重点关注 type ,rows,结果 type 的值为 ALL 代表全表扫描。
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
sql 查询优化中一个很重要的指标,结果值从好到坏依次是:而我这个 SQL 执行计划只是 ALL,只能哭了。
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
所以进行 SQL 优化,我只有两个方向
一、降低找到所需记录索要读取的行数
二、让 Type 的值 达到 ref
解决办法给所有的表的那个字段加索引
ALTER TABLE testa
ADD INDEX index_name ( service
)
来看看加索引之后的对比吧
优化之前
一个 SQL 查半天没回应
优化之后
耗时 50ms 内
执行计划的对比
优化前
优化后