为什么代码规范要求SQL语句不要过多的join


Posted in MySQL onJune 23, 2021

送分题

面试官:有操作过Linux吗?

:有的呀

面试官:我想查看内存的使用情况该用什么命令

free 或者 top

面试官:那你说一下用free命令都可以看到啥信息

:那,如下图所示 可以看到内存以及缓存的使用情况

  • total 总内存
  • used 已用内存
  • free 空闲内存
  • buff/cache 已使用的缓存
  • avaiable 可用内存

为什么代码规范要求SQL语句不要过多的join

面试官:那你知道怎么清理已使用的缓存吗(buff/cache)

:em… 不知道

面试官sync; echo 3 > /proc/sys/vm/drop_caches就可以清理buff/cache了,你说说我在线上执行这条命令做好不好?

为什么代码规范要求SQL语句不要过多的join

:(送分题,内心大喜)好处大大的有,清理出缓存我们就有更多可用的内存空间, 就跟pc上面xx卫士的小火箭一样,点一下,就释放出好多的内存

面试官:em…, 回去等通知吧

再谈SQL Join

面试官:换个话题,谈谈你对join的理解

: 好的(再答错就彻底完了,把握住机会)

回顾

SQL中的join可以根据某些条件把指定的表给结合起来并将数据返回给客户端

join的方式有

inner join 内连接

为什么代码规范要求SQL语句不要过多的join

left join 左连接

为什么代码规范要求SQL语句不要过多的join

right join 右连接

为什么代码规范要求SQL语句不要过多的join

full join 全连接

为什么代码规范要求SQL语句不要过多的join

面试官:在项目开发中如果需要使用join语句,如何优化提升性能?

: 分为两种情况,数据规模小的,数据规模大的。

面试官: 然后?

:对于

  • 数据规模较小 全部干进内存就完事了嗷
  • 数据规模较大

可以通过增加索引来优化join语句的执行速度 可以通过冗余信息来减少join的次数 尽量减少表连接的次数,一个SQL语句表连接的次数不要超过5次

面试官:可以总结为join语句是相对比较耗费性能,对吗?

:是的

面试官: 为什么?

缓冲区

: 在执行join语句的时候必然要有一个比较的过程

面试官: 是的

:逐条比较两个表的语句是比较慢的,因此我们可以把两个表中数据依次读进一个内存块中, 以MySQL的InnoDB引擎为例,使用以下语句我们必然可以查到相关的内存区域show variables like '%buffer%'

为什么代码规范要求SQL语句不要过多的join

如下图所示join_buffer_size的大小将会影响我们join语句的执行性能

面试官: 除此之外呢?

一个大前提

:任何项目终究要上线,不可避免的要产生数据,数据的规模又不可能太小

面试官: 是这样的

:大部分数据库中的数据最终要保存到硬盘上,并且以文件的形式进行存储。

以MySQL的InnoDB引擎为例

  • InnoDB以(page)为基本的IO单位,每个页的大小为16KB
  • InnoDB会为每个表创建用于存储数据的.ibd文件

为什么代码规范要求SQL语句不要过多的join

验证

为什么代码规范要求SQL语句不要过多的join

:这意味着我们有多少表要连接就需要读多少个文件,虽然可以利用索引,但还是免不了频繁的移动硬盘的磁头

面试官:也就是说频繁的移动磁头会影响性能对吧

:是的,现在的开源框架不都喜欢说自己通过顺序读写大大的提升了性能吗,比如hbasekafka

面试官:说的没错,那你认为Linux有对此做出优化吗?提示,你可以再执行一次free命令看一下

:奇怪缓存怎么占用了1.2G多

为什么代码规范要求SQL语句不要过多的join

为什么代码规范要求SQL语句不要过多的join

面试官: 你有没有想过

  • buff/cache 里面存的是什么,?
  • 为什么buff/cache 占了那么多内存,可用内存即availlable还有1.1G
  • 为什么你可以通过两条命令来清理buff/cache占用的内存,而想要释放used只能通过结束进程来实现?

品,你细品

思考了几分钟后

为什么代码规范要求SQL语句不要过多的join

:这么随便就释放了buff/cache所占用的内存,说明它就不重要, 清除它不会对系统的运行造成影响

面试官: 不完全对

:难道是?想起来《CSAPP》(深入理解计算机系统)里面说过一句话

存储器层次结构的本质是,每一层存储设备都是较低一层设备的缓存

为什么代码规范要求SQL语句不要过多的join

翻译成人话,就是说Linux会把内存当作是硬盘的高速缓存

面试官:现在知道那道送分题应该怎么回答了吧

:我…

为什么代码规范要求SQL语句不要过多的join

Join算法

面试官:再给你个机会,如果让你来实现Join算法你会怎么做?

:无索引的话,嵌套循环就完事了嗷。有索引的话,则可以利用索引来提升性能.

面试官:说回join_buffer 你认为join_buffer里面存储的是什么?

:在扫描过程中,数据库会选择一个表把他要返回以及需要进行和其他表进行比较的数据放进join_buffer

面试官:有索引的情况下是怎么处理的?

:这个就比较简单了,直接读取两个表的索引树进行比较就完事了嗷,我这边介绍一下无索引的处理方式

Nested Loop Join

为什么代码规范要求SQL语句不要过多的join

嵌套循环,每次只读取表中的一行数据,也就是说如果outerTable有10万行数据, innerTable有100行数据,需要读取10000000次(假设这两个表的文件没有被操作系统给缓存到内存, 我们称之为冷数据表)

当然现在没啥数据库引擎使用这种算法(太慢了)

Block nested loop

为什么代码规范要求SQL语句不要过多的join

Block 块,也就是说每次都会取一块数据到内存以减少I/O的开销

当没有索引可以使用的时候,MySQL InnoDB 就会使用这种算法

考虑以下两个表 t_at_b

为什么代码规范要求SQL语句不要过多的join

当无法使用索引执行join操作的时候,InnoDB会自动使用Block nested loop 算法

为什么代码规范要求SQL语句不要过多的join

总结

上学时,数据库老师最喜欢考数据库范式,直到上班才学会一切以性能为准,能冗余就冗余,实在冗余不了的就join如果join真的影响到性能。试着调大你的join_buffer_size, 或者换固态硬盘。

到此这篇关于为什么代码规范要求SQL语句不要过多的join的文章就介绍到这了,更多相关SQL语句不要过多join内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL主从复制断开的常用修复方法
Apr 07 MySQL
详解mysql三值逻辑与NULL
May 19 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
MySQL中日期型单行函数代码详解
Jun 21 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
MySQL快速插入一亿测试数据
MySQL8.0.18配置多主一从
Jun 21 #MySQL
MySQL中日期型单行函数代码详解
如何搭建 MySQL 高可用高性能集群
Jun 21 #MySQL
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
Jun 21 #MySQL
分析mysql中一条SQL查询语句是如何执行的
You might like
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
python 读写、创建 文件的方法(必看)
2016/09/12 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
python 读取文件并替换字段的实例
2018/07/12 Python
Python chardet库识别编码原理解析
2020/02/18 Python
Python使用re模块验证危险字符
2020/05/21 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
python/golang 删除链表中的元素
2020/09/14 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
日语求职信范文
2013/12/17 职场文书
费用会计岗位职责
2014/01/01 职场文书
高二化学教学反思
2014/01/30 职场文书
岗位工作说明书
2014/07/29 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
运动会广播稿300字
2015/08/19 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js