一 普通sql执行的具体过程

1 连接器

管理连接,权限验证

2 分析器

词法分析,语法分析

比如 数据表和数据列是否存在, 别名是否有歧义,是否符合标准sql语法等

3 优化器检测

执行计划生成,索引选择

4 执行器

1 判断是否拥有操作权限->这里包含更为复杂的权限验证,比如触发器,存储过程等

2 执行sql,返回结果集到客户端

5 存储引擎层

存储引擎层提供和server端进行交互的读写接口,存储真正的数据

注意

1 本文不考虑查询缓存的情况,因为现在线上数据库都建议关闭查询缓存,8.0已经删除查询缓存功能

2 执行器如何执行sql取值的

调用 InnoDB 引擎接口取这个表的每一行,重复逻辑判断,存储符合条件的值在内存,最后将符合结果的集合返回到客户端

核心思想

1 减少storage和server层的交互

2 sql语句中花费时间最多的便是storage和server层的交互

具体过程

1 server根据where条件 通过innodb api接口,生成index_key确定上下界范围

2  让innodb层进行条件过滤,然后再返回到server层进行二次判断

3 是逐条扫描返回.由于客户端的设计,等待全部查询完才会展示给用户  参数net_buffer_length规定的大小,写满net_buffer后就通过网络接口发送,然后再清除,继续写入,以此类推

二 如何利用索引

1 几个概念

index_key MySQL是用来确定扫描的数据范围

index_filter MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。

table_filter MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤

2 过程几点

1 mysql 根据 sql优化器对于sql本身进行二次处理,目的获取可用的索引以及索引扫描的上下边界(如果有的话)

上边界通过>= >进行确定 遇到>= =进行匹配,遇到>终止匹配

下边界通过<= < 进行确定 遇到<= =进行匹配,遇到

等值通过 = 进行判定

3 补充要点

1 针对多条件查询也会逐一进行判定

2 联合索引也只是一颗B+树,所以多条件也能确定上下边界 针对语句的处理

3 通常我们利用到的是index_key

4 可以根据ICP特性利用到index_filter

5 没有用到索引的只能table_filte

4 针对语句的处理

1 in ( 1, 2, 3) 等同于 a=1 or a=2 or a=3

2 between 1 and 10 等同于 >=1 <=10

5  附上 八怪大神的图片

mysql 范围查询的流程 mysql范围查询原理_sql

五 总结