部队门户网站建设方案,wordpress优化检测,找人做网站,建设一个电影网站怎么做对于很多开发小伙伴来说#xff0c;每天写SQL是必不可少的一项工作。
那不知道大家有没有深入了解过#xff0c;当我们的一条SQL命令被执行时#xff0c;MySQL是如何把数据从硬盘/内存中查出来并展示到用户面前的呢#xff1f;
其实#xff0c;MySQL也没有大家想象的那么…对于很多开发小伙伴来说每天写SQL是必不可少的一项工作。
那不知道大家有没有深入了解过当我们的一条SQL命令被执行时MySQL是如何把数据从硬盘/内存中查出来并展示到用户面前的呢
其实MySQL也没有大家想象的那么神秘当我们从整个架构的角度去看待MySQL会分为Server层和引擎层。
Server层主要包含连接器、分析器、优化器、执行器还有各种函数之类的东西等等。
而引擎层就是用来真正处理数据比如保存数据提供读写接口供Server使用。
并且引擎层是可插拔的就是说我们可以使用各种类型的引擎比如最常见的InnoDB引擎。
甚至你不想使用官方的引擎自己开发一个也是可以的。
那更进一步MySQL是如何查询一条数据的呢 以上图为例是一个简陋版的普通二级索引B树结构。
图中的每个颜色代表一个数据页每个数据页中的数据会按照从小到大的顺序排列并且会组成一个单向链表即前一条数据有一个指向后一条数据的指针。不同的数据页之间也会组成一个双向链表。
这样的好处在于当查询到第一条数据之后只需要按照顺序查下一条数据而不用再次从根节点往下查大大节省了查询效率。
好了我们回归正题下面以一个简单的例子看一下Server层和引擎层是如何分工的。
我们知道MySQL在执行一条sql之前会通过优化器生成执行计划选择合适的索引。
以下面这条sql为例
SELECT * FROM system_log
WHERE create_time BETWEEN 2022-01-01 AND 2022-02-01;我们按照创建时间查询日志表的一些记录并且对创建时间字段create_time加上索引那么执行计划就是这样的 从上图中我们可以看到MySQL选择了索引index_createTime执行type是range表示会按照范围进行查询。
那么Server层和引擎层是如何分工的呢
1Server通过执行器调用InnoDB引擎的查询接口InnoDB引擎根据条件开始定位第一条记录。
2由于选择使用index_createTime索引那么InnoDB引擎就会去这颗索引树上查找符合条件的第一条记录。
而我们使用的是select *要查询全部的数据而普通索引树上的叶子节点只保存着索引列和主键列所以需要拿着主键id去聚簇索引回表查询一条完整的记录。
查询到完整记录之后InnoDB就会把这条数据发送给ServerServer把这条数据返回给客户端。隐藏知识点MySQL是边查边发的
3InnoDB继续查询下一条数据在上文我们说过数据页中数据会组成一个单向链表可以很方便的直接定位到下一条数据找到下一条数据之后判断是否符合条件如果符合就继续回表查询完整数据然后再把数据发送给ServerServer再把数据返回到客户端。
就这样不断的重复这个步骤直到InnoDB匹配到不符合条件的记录就停止查询告诉Server数据已经查完了。
Server层和引擎层的交互大致就是这样的。
总结一下就是Server调用InnoDB引擎接口查询数据引擎把数据一条条的查出来并不断的反馈给ServerServer再将数据返回给客户端。
另外我们可以在上图的执行计划中看到extra中出现了Using index condition的字样这表示MySQL使用了索引下推的优化策略。
有时我们还能发现extra中会出现Using Where 的提示这是什么意思呢
比如我们改一下上面的查询sql增加一个request_id232333’的查询条件。
SELECT*
FROMsystem_log
WHEREcreate_time BETWEEN 2022-01-01 AND 2022-02-01 AND request_id 232333;再次通过explain查看执行计划 Using where的意思就是说InnoDB引擎查询到一条数据之后虽然这条数据满足create_time BETWEEN ‘2022-01-01’ AND 2022-02-01’这个条件但是还需要Server层再去判断一下是否符合request_id 232333’这个条件两者都符合的情况下才会被发送到客户端。
大家看到这里应该也清楚MySQL的Server是如何与InnoDB引擎交互的了下次再遇到面试官问这种问题相信大家就知道该怎么回答了。
finally都看到这里了点个赞再走吧。