一 普通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 的查询 access mysql 的查询语句_查询缓存