面试官灵魂拷问:为什么SQL语句不要过多的join?

“为什么SQL语句不要过多的join?”

最近有个同学跑来问我如何回答面试官的这个问题,我说你直接怼他“为何MySQL如此垃圾,连join都不能写?!
在这里插入图片描述

哈哈哈,开个玩笑,讲个故事开始今天的文章。

很久以前,有个公司真的有这么一个关系型数据库,出于某种未知原因,就是不能过多join,你敢这么做,特别是在应用程序里这么写,数据库就敢给你罢工。

当时,为了完成这个项目,老一辈先驱们达成了几个重要的共识:

  1. 进度为大,没时间再回头探究数据库设计了;
  2. 这个功能可以在应用层面实现,多搞几个中间查询就是了,不打紧;
  3. 干脆别的地方也不要 join了,没功夫测试,都改成 1 那样比较稳妥;
  4. 未来我们会招专职 DBA ,到了那一天,一切都会好起来的。 然后,项目上线,取得了重大成功。

项目经理很激动,认真的对项目进行了复盘,同时把大量的“项目经验”收入了“组织过程资产”里,自然也包括技术团队的这个“不要 join”的重要经验!

钻石恒久远,一颗永流传~祖训终于传到面试官这儿,被你遇上了。

其实:无脑的不允许(outer)join是不对的
SQL Joins

一般来说,需要减少join的场景是数据量单机盛不下,需要使用分布式数据库,这类应用一般来说并发也会比较高。

这类场景里,真正决定能不能(outer)join的,是这个sql语句能不能谓词下推,以及网络传输成本高低(一些join会引起数据shuffle,网络传输成本急剧升高)。

不管你在数据库里join,还是单表查了在应用内存里join,join算法的复杂度总是存在的,区别可能是减轻了数据库的压力,并且应用层一般无状态,可以平滑扩容。

另外,如果想减少join,设计上就要考虑更多冗余,而这些冗余字段,数据库优化器是不知道的,数据库的优化只能保证逻辑上是等价的,这些业务上等价但逻辑上可能不等价的东西,数据库几乎无法优化

但考虑到网络传输成本,有些时候,不join是不行的,比如数据汇总;比如有外连接情况下,两侧都有筛选条件的分页查询。如果你不在数据库join,还要保证结果正确性,那可能就得把几亿,几十亿,几百亿的数据都查到应用端,这是网络不能承受的。

这个事情展开来讲非常复杂。一般面试官可能也只是想看看你脑子里有没有这个概念而已。甚至他自己可能也不明白为什么不用join。

至于很多人说的mysql垃圾,好吧,mysql确实垃圾,但这根本不是问题的症结。
在这里插入图片描述

如果你的数据量单机就能玩的转,那大可不必做这种过度设计,放心join就好。

但放心join之前,别忘了给内表的连接字段加索引,数据库最通用也最基础的join算法是nested loop join,说白了就是for循环套娃。

假设经过谓词下推,外表有m条数据,内表有n条数据,那么它join的时间复杂度是O(mn),如果内表的关联列上有索引,那就会降到O(mlogn),在现实中可能就是毫秒级和分钟级的区别。

说白了,不管join与否,都是两害相权取其轻。

最后给大家推荐一款最近发现的好用免费SQL工具:SQL Studio。

(1)免费。(谁不喜欢白嫖呢?)

(2)免费的基础上支持几乎所有主流数据库,不仅有MySQL、Oracel、PostgresSQL等国外数据库,还支持武汉达梦、人大金仓等国产数据库。
在这里插入图片描述

(3)突出亮点:Web版工具——一次部署,团队成员都能使用,占用的硬件资源都在服务器上;只要有可登录的软件链接和账号、密码,任意设备随时可用这款工具:省去了繁琐的工具安装配置、升级过程。(对于团队协作和教学场景简直不要太友好)
在这里插入图片描述

(4)亮点延伸:用户管理——SQL Studio只有管理员可以新建账号、也只有管理员‬可以‬增加‬和‬删除‬数据源‬,这样避免了许多安全问题。
用户管理

(5)性能稳定且可圈可点:

a.可视化管理——支持图形化界面对数据库、表进行管理;支持直接修改表结构、表数据等,还能显示操作对应的SQL语句。
查看,修改表

b.写sql支持智能提示:可以根据用户输入的字符及其语意提示表名等信息。
智能提示和数据库列表搜索

c.每次执行的SQL语句都会保存在主界面的“历史查询”中,而且找到对应语句可以直接复用。

d.经常需要用到的SQL语句也可以直接保存在主界面“保存的查询”中,不用再从电脑本地导入,而且能直接修改、复制、删除。
在这里插入图片描述

e.除了“历史查询”、“保存的查询”还有“历史导出”功能,每一次下载数据都会被记录,保证了工具完整的审计功能。

f.超强的数据导入、导出能力:近700万行数据导出只需20多秒,比Navicat还快两倍。

g.稳定性好:展开数据库中一万张表,丝毫不卡顿。SQL编辑框支持注释,有注释也能很好地执行语句,不出bug稳定性强。

h.一键批量执行:单击执行编辑框内所有SQL语句,方便大家进行刷库等操作。
在这里插入图片描述

i.一键解释执行:单击即可帮助大家分析sql语句的性能,辅助优化。
在这里插入图片描述

j.结果栏支持调整每页展示多少条数据、且支持改变排序和全屏,看数据更方便。

k.数据库列表、结果栏、历史查询、保存查询都支持搜索定位。

好啦,今天的分享就到这里了。如果面试官问你:为什么SQL语句不要过多的join?你会怎么回答呢?SQL Studio大家觉得好用吗?

猜你喜欢

转载自blog.csdn.net/ylguoguo6666/article/details/129611950
今日推荐