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 内

执行计划的对比
优化前

优化后


↙↙↙阅读原文可查看相关链接,并与作者交流