一条SQL的奇妙旅行
VOL 157
10
2020-09
今天距2021年112天
这是ITester软件测试小栈第157次推文
点击上方蓝字“ITester软件测试小栈“关注我,每周一、三、五早上 08:30准时推送,每月不定期赠送技术书籍。
微信公众号后台回复“资源”、“测试工具包”领取测试资源,回复“微信群”一起进群打怪。
本文2006字,阅读约需6分钟
工作中我们经常查询数据库,用一个查询,得到想要的数据。可有想过,我们得到答案经过了哪些磨难?经历了哪些诱惑?
以下将以一条SQL的执行过程来了解 MySQL 整体架构,对MySQL有一个全面,清晰的认知,For造航母。
一
开始旅行
第1关
连接器
客户端
发送一条查询给服务器,包含客户端相关信息(IP、用户、密码),服务器完成验证。
报告太君,自己人,可以放行!
第2关
查询缓存
执行查询语句的时候,会先查询缓存,我们会发现某个查询,查询第二次的时候非常快便是这个原因(MySQL8.0 废除这个功能,太鸡肋)。
......
第3关
解析器
第一步:解析你的语法,主要是关键字;
单词别写错了,写错了,我可不会干活。
第二步:解析涉及到的对象是否存在;
人都没有,跟空气聊个啥呢?
第三步:涉及到的对象用户是否有对应的权限。
哎呀,不给钱就不给看,不给看。
第4关
优化器
当语法与语义都没有问题权限也匹配,此时数据库便开始真正为你服务了,根据一定得算法规则,对你的查询进行优化,寻找最优的执行计划。
国家分配的跟自己找的肯定还是不一样的,多数情况下,还是自己找的好。
第5关
执行
先判断数据是否在缓冲池中,若在,直接返回,若不在,则先从磁盘文件中加载到内存。
嘻嘻,反正今天要定了。
第6关
数据返回
数据返回是一边查询,一边返回,并不是一次返回,虽然看上去是一下突然返回的。
BTW,你看见的不一定是真的。
旅行图如下:
二
MySQL体系结构
最外层客户端:各种语言API连接数据库。
第1层
连接层
包含连接池,身份验证,查询缓存。
第2层
核心服务层
解析器,优化器,跨存储引擎的函数,存储过程,触发器,视图,SQL接口,管理服务工具组件。
第3层
存储引擎层
不同存储引擎即数据的存取方式不同。
第4层
文件系统
文件系统,底层存储数据的磁盘。
MySQL体系架构图如下:
三
InnoDB存储引擎三大特性
特性1
自适应hash索引
B+树的高度一般为3~4层,故需要3~4次的查询,如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引
(Adaptive Hash Index,AHI) AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引 --来自INNODB 技术内幕(人工智能赶脚有没有)。
缺点: 跟普通索引一样需要额外开销维护。
特性2
插入缓冲
对于非聚集类索引的插入和更新操作,不是每一次都直接插入到索引页中,而是先插入到内存
中。具体做法是:如果该索引页在缓冲池中,直接插入;否则,先将其放入插入缓冲区中,再以一定的频率和索引页合并,这时,就可以将同一个索引页中的多个插入合并到一个IO操作中,大大提高写性能(一定是非聚集索引)。
缺点:可能导致数据库宕机后实例恢复时间变长,占用太多缓冲池内存。
特性3
双写
当MySQL将脏数据flush到data file的时候, 先使用memcopy 将脏数据复制到内存中的double write buffer ,通过double write buffer再分2次,每次写入1MB到共享表空间,然后马上调用fsync函数,同步到磁盘
上,避免缓冲带来的问题(前俩个是提升性能,双写主要保证数据页的可用性)。
InnoDB存储引擎内存结构图如下:
今日问题:
你知道MySQL索引的用途,以及主键索引与二级索引的区别是什么吗?
(欢迎在下方留言区发表你的看法)
以上
That‘s all
更多系列文章
敬请期待
ITester软件测试小栈
往期内容宠幸
1.Python接口自动化-接口基础(一)
2.Python接口自动化-接口基础(二)
3.Python接口自动化-requests模块之get请求
4.Python接口自动化-requests模块之post请求
5.Python接口自动化之cookie、session应用
6.Python接口自动化之Token详解及应用
7.Python接口自动化之requests请求封装
8.Python接口自动化之pymysql数据库操作
9.Python接口自动化之logging日志
10.Python接口自动化之logging封装及实战
想获取更多最新干货内容
快来星标 置顶 关注我
每周一、三、五 08:30见
<< 滑动查看下一张图片 >>
后台 回复"资源"取干货
回复"微信群"一起打怪升级
个人微信:Cc2015123
添加请注明来意 :)
真爱三连,BiuBiuBiu~
一条SQL的奇妙旅行相关推荐
- Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句
目录 1.Mybatis 获取当前序列和下一个序列值 2.Mybatis 在一个方法中写多条SQL 语句 1.Mybatis 获取当前序列和下一个序列值 #获取当前序列值 select XXX_seq ...
- python执行mysql多个sql语句_mysql -- 一次执行多条sql语句
最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...
- MySQL数值扩大一百倍_Mysql优化----一条SQL百倍提升之旅
在实现业务逻辑的时候,有些复杂一点逻辑会用数据库子查询去实现,但是sql用子查询会带来性能问题,下面就一个例子来说明,怎么优化子查询,来提升查询速度 mysql> desc update t_s ...
- MySQL番外篇:一条SQL查询语句是如何执行的?
在面试的过程中,有的面试官会给出一条简单的SQL查询语句,让简单说一下执行的过程. SELECT * FROM emp where age=30; 以下问MySQL的基本架构图,从中可以看出SQL语句 ...
- 惊呆,一条sql竟然让oracle奔溃了
一条sql就能让oracle挂了,真的是不敢相信啊,前几天生产上确实出现了这样一个故障,我们来一起做一个事件回放. 系统介绍 系统架构见下图: application1和application2是一个 ...
- 阿里一面,给了几条SQL,问需要执行几次树搜索操作?
前言 有位朋友去阿里面试,他说面试官给了几条查询SQL,问:需要执行几次树搜索操作?我朋友当时是有点懵的,后来冷静思考,才发现就是考索引的几个基础知识点~~ 本文我们分九个索引知识点,一起来探讨一下. ...
- 因为一条SQL,程序员差点被祭天......
来源:鄙人薛某 作者:很懒的程序员 上周四午休时分,我正在工位上小憩,睡梦中仿佛看到了自己拿着李白在荣耀峡谷里大杀四方的情景,就在我刚拿完五杀准备带领队友推对面水晶的时候,一句慌乱急促的" ...
- oracle一条sql的执行过程,请问执行一条sql的整个过程是怎样的,谢谢!
select count(*) into c from yaoyao_pbj where object_id=7559; select count(*) into c from yaoyao_pbj ...
- mysql数据库会同时执行sql吗_mysql 一次执行多条sql语句
最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...
最新文章
- 如何下python 的pⅰl_[Ubuntu] 如何在 Lubuntu 安装 python-spidermonkey
- 5大洲,32个国家:剑桥分析公司的触角到底有多远?
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- OpenCV提取图像颜色直方图
- c语言药房系统书写指导书,C语言药房管理系统[文书借鉴]
- python语法实例_python基本语法练习实例
- RocketMQ消息支持的模式-OrderProducer(顺序)
- [aspnetcore.apidoc]一款很不错的api文档生成工具
- webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)
- Ubuntu16.04直接修改root密码
- android url格式化,Android利用SpannableString实现格式化微博内容
- 2019年春第四次课程设计实验报告
- linux类似everything的软件,安装linux下强大的文件工具fsearch,与windows下Everything类似...
- cad字体安装_拿了CAD字体不知道怎么装?看过来
- reg型变量怎么赋值_FPGA的wire和reg类型变量
- plsql取消文件备份
- Altium Designer系列:问题之无法打开pcb文件
- 工信部怒了,App 厂商们又作死
- MATLAB的GUI小游戏—你话我猜
- @2048小游戏——C语言、多文件编程、Linux系统
热门文章
- RichEdit控件的使用(未完)
- Junit下获取src/test/resource路径
- python编程(多线程c回调python)
- android gradle fail,Android Studio更新后,Android Gradle CompilationFailedException
- oppo手机计算机,OPPO手机助手
- linux查看tmp,linux下find(文件查找)命令的用法总结-tmp文件
- 如何备份服务器日志到其他服务器_云计算迁移别忘了备份物理服务器和数据
- java项目嗖嗖移动业务大厅项目报告_Java就业指导课程
- 现在这个时代变了,区块链,数字货币才是最火的项目
- laravel中Blade模板继承