面试官灵魂拷问:为什么SQL语句不要过多的join?
创始人
2025-05-29 20:15:48
0

“为什么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大家觉得好用吗?

相关内容

热门资讯

台州最新学区划分,最新或202... 台州公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍台州小...
衢州最新学区划分,最新或202... 柯城区最新或2023(历届)学区划分衢江区最新或2023(历届)学区划分
舟山最新学区划分,最新或202... 临城新区】1、南海实验小学片区:新城沈白线以南、千岛路以西区域,以及长峙社区居民子女。2、舟山第二小...
④电子产品拆解分析-太阳能自动... ④电子产品拆解分析-太阳能自动感应灯一、功能介绍二、电路分析以及器件作用1、太阳能控制电路分析2、优...
丽水最新学区划分,最新或202... 根据“就近入学,统筹安排”为原则,公办小学学区划分也已出炉。  市实验学校:丽阳门居委、高井弄居委。...
海南最新学区划分,最新或202... 1.市直属学校招生范围划分小 学招 生 范 围海口市滨海第九小学滨海大道北侧(至海边),港进路和港集...
从ChatGPT到AGI还有多... 1.引子 21年开始在公司负责一个全链路语音的项目,支持公司的Iot设备,...
海口最新学区划分,最新或202... 海口公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍海口小...
青海最新学区划分,最新或202... 为方便家长和学生们了解自己孩子所就读的小学或是自己孩子的户口究竟在不在想要入读的中学的学区范围内,小...
西宁最新学区划分,最新或202... 西宁公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍西宁小...
三亚最新学区划分,最新或202... 三亚公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍三亚小...
贵州最新学区划分,最新或202... 为方便家长和学生们了解自己孩子所就读的小学或是自己孩子的户口究竟在不在想要入读的中学的学区范围内,小...
21- 神经网络模型_超参数搜... 知识要点 fetch_california_housing:加利福尼亚的房价数据&#...
一文了解GPU并行计算CUDA 了解GPU并行计算CUDA一、CUDA和GPU简介二、GPU工作原理与结构2.1、基础GPU架构2....
贵阳最新学区划分,最新或202... 贵阳公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍贵阳小...
遵义最新学区划分,最新或202... 遵义公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍遵义小...
安顺最新学区划分,最新或202... 安顺公办小学招生范围按照义务教育免试就近入学原则,市区公办小学实行依街道划片招生。本文为您介绍安顺小...
六盘水最新学区划分,最新或20... 百年教育网小编为您整理了关于六盘水市幼升小学区划分详情的相关信息,希望对您有帮助,想了解更多请继续关...
遍历二叉树线索二叉树 遍历二叉树 遍历定义 顺着某一条搜索路径寻访二叉树中的每一个结点,使得每个节点均被依次...
springboot简介和项目... Java知识点总结:想看的可以从这里进入 目录SpringBoot1、简介和原理1....