最近,工作稍微没有那么繁忙,抽空记录一下遇到相关技术问题吧,最近有一个同事找我要一个MySQL数据库的一个数据报表,数据给他查出来了,随便把sql也丢给他了,他说我写的sql执行效率有点低。一眼看过去都是嵌套,我干数据也算有些年头了,我觉得我也是个老手了,写的sql真的执行效率那么低么?于是开始了我的分析之路。
1.问题sql回顾
我的嵌套sql:
SELECT count(1) FROM `log_user_integral` b
where r_user_code in
(select d_user_code from `user` where r_area_code in (
select d_area_code from practical_area
where d_level_code like'%348bbfeadd0e4e9eb29551591dd1488a%')
)
这里的like是逃不掉了。
同事认为的sql应该是这样:
SELECT count(1) FROM `log_user_integral` b
-- where r_user_code in
INNER JOIN
(select d_user_code from `user` where r_area_code in (
select d_area_code from practical_area where d_level_code like'%348bbfeadd0e4e9eb29551591dd1488a%')
) a
on b.r_user_code=a.d_user_code
这里只做一层join,方便后期进行对比,如果效率高,后期都改过来就是了。
2.查看索引的引用情况
我的嵌套sql
正常的join sql
从索引的引用和查找行数上来看,两者保持一致。
3.sql执行时间
从执行时间来看join的执行时间快了0.001s,其实是没什么区别的。
4.总结
嵌套循环在MySQL中看起来跟join效果差不多,但实际上还是join使用场合更多一些,不容易受人质疑。有些数据库和数仓对这种嵌套写法,其实不是很友好,比如hive就只支持一层嵌套。传统的数据库,执行效率还是得看对索引的扫描情况,如果用于线上反复运行,还是需要分析一下,偶尔提取一下报表,影响不大,各位看官,如果不同意见,欢迎评论区留言,也欢迎大家关注公众号造轮子的坦克,可以获取我的个人微信联系方式。