2024/08/26
优化思路1:在 mid? 和 uid 上建立索引后再 explain:
时间下降到: 0.039s。
优化思路2:采用left join 和 右表.id is null 的方法优化:
没有建立索引时间: 0.031s
建立索引时间: 0.016s
飘易发现采用 left join 方法执行sql语句的时候:
没有索引的前提下,执行时间仅为not in方法的 1.6/千分 【0.031/18.898】;
建立了索引后消耗时间仅为not in(也建立索引)方法的 40% 【0.016/0.039】。
索引 | not in 执行时间 | left join?执行时间 | 优化后时间占比 |
无索引 | 18.898 | 0.031 | 1.6‰ |
有索引 | 0.039 | 0.016 | 40% |
可以看到优化后的 Handler_read_rnd_next 值下降到了22万。
注:LEFT JOIN 关键字会从左表那里返回所有的行,即使在右表中没有匹配的行。
EXPLAIN sql:
【例二】:原先的not in的sql语句2:
时间: 39.208s
可以看到 Handler_read_rnd_next 值很大,达到了 2500万,也是全表扫描导致的。
采用left join 和 右表.id is null 方法优化:
时间: 0.048s
优化后?Handler_read_rnd_next 的值下降到了 18万。
LEFT JOIN 要点:
在mysql的 left join 中条件放在on后面和在where后面是不同的;
1.?on后面只针对于t2表进行过滤,所以上面的 t1.id>1 将不起作用,切记,切记;
2. where后面会对最终结果产生影响,所以如果t2.id<>3放到on后面和where后面也是会返回不同的结果;
? 例如下面脚本一会比脚本二多返回一些数据。
本文完。