主页 > 新闻资讯 > 机构数据分析培训之从server层和存储引擎层如何分析Limit?

机构数据分析培训之从server层和存储引擎层如何分析Limit?

作者:覃老师 浏览次数: 2021-10-13 17:58
机构数据分析培训之从server层和存储引擎层如何分析Limit?
 
MySQL其实是分为server层和存储引擎层的:
server层负责处理一些通用的事情,诸如连接管理、SQL语法解析、分析执行计划之类的东西。
存储引擎层负责具体的数据存储,诸如数据是存储到文件上还是内存里,具体的存储格式是什么样的之类的。我们现在基本都使用InnoDB存储引擎,其他存储引擎使用的非常少了,所以我们也就不讨论其他存储引擎了。

 MySQL中一条SQL语句的执行是通过server层和存储引擎层的多次交互才能得到最终结果的。先不用Limit子句举一个简单例子分析:
SELECT * FROM demo_info WHERE key1 > 'a' AND key1 < 'b' AND common_field != 'a';
server层会分析到上述语句可以使用下边两种方案执行:
机构数据分析培训

方案一:使用全表扫描
 
方案二:使用二级索引idx_key1,此时需要扫描key1列值在('a', 'b')之间的全部二级索引记录,并且每条二级索引记录都需要进行回表操作。
  server层会分析上述两个方案哪个成本更低,然后选取成本更低的那个方案作为执行计划。然后就调用存储引擎提供的接口来真正的执行查询了。
这里假设采用方案二,也就是使用二级索引idx_key1执行上述查询。那么server层和存储引擎层的执行过程如下:
  server层:“去查查idx_key1二级索引的('a', 'b')区间的第一条记录,然后把回表后把完整的记录返给我”
  InnoDB层:InnoDB就通过idx_key1二级索引对应的B+树,快速定位到扫描区间('a','b')的第一条二级索引记录,然后进行回表,得到完整的聚集索引记录返回给server层。 server层收到完整的聚集索引记录后,继续判断common_field!='a'条件是否成立,如果不成立则舍弃该记录,否则将该记录发送到客户端。然后对存储引擎说:“请把下一条记录给我”
注意
  此处将记录发送给客户端其实是发送到本地的网络缓冲区,缓冲区大小由net_buffer_length控制,默认是16KB大小。等缓冲区满了才真正发送网络包到客户端。
  InnoDB层:InnoDB找到idx_key1的('a', 'b')区间的下一条二级索引记录,然后进行回表操作,将得到的完整的聚集索引记录返回给server层。
注意
  不论是聚集索引记录还是二级索引记录,都包含一个称作next_record的属性,各个记录根据next_record连成了一个链表,并且链表中的记录是按照键值排序的(对于聚集索引来说,键值指的是主键的值,对于二级索引记录来说,键值指的是二级索引列的值)。
机构数据分析培训
  server层收到完整的聚集索引记录后,继续判断common_field!='a'条件是否成立,如果不成立则舍弃该记录,否则将该记录发送到客户端。然后对存储引擎说:“请把下一条记录给我哈”
  … 然后就不停的重复上述过程。
  直到InnoDB发现根据二级索引记录的next_record获取到的下一条二级索引记录不在('a', 'b')区间中,就跟server层说:“('a', 'b')区间没有下一条记录了”
server层收到InnoDB说的没有下一条记录的消息,就结束查询。
 
      以上是机构数据分析培训之从server层和存储引擎层如何分析Limit的讲解。如果想了解更多详情,请点击成都卡米古大数据官网!成都大数据培训学校、大数据开发培训、数据分析与挖掘、零基础课程正在招生中!
 
 

标签:
热点排行
推荐文章
立即申请>>