小林coding网站---mysql基础-server层-mysql查询缓存-解析器-优化器

查询缓存

  1. 针对查询语句,mysql先回去查询缓存(query cache)里面去找缓存,看看之前是否执行过查询命令,查询缓存是以key-value形式保存在内存中,key为sql的查询语句,value为查询的结果。
  2. 如果查询的语句命中了查询缓存,则直接返回给客户端value的数据,如果没有命中,则继续执行sql查询语句,执行完成后,将结果缓存到查询缓存中。
  3. 针对更新频繁的表,查询缓存的命中率极低,只要有表的更新操作,则查询缓存就会被清空。
  4. 在mysql8.0中,直接将这个模块去掉了,没有查询缓存这个阶段了。

解析器

解析器会做两件事情:

  1. 词法分析
    mysql会根据输入的字符串识别出关键字,构建出sql语法树,根据后面的模块获取sql类型,表名,字段名,where条件等

  2. 语法分析
    根据词法的分析结果,语法解析器会根据语法规则,判断输入的slq是否满足mysql的语法

执行sql

每个sql语句的流程分为以下三个阶段:

  1. prepare阶段,预处理
  2. optimize阶段,优化阶段
  3. execute阶段,执行阶段

执行计划由优化器来完成

优化器主要负责将sql的查询语句的执行方案确定下来,比如说表里有多个索引的时候,优化器会基于查询成本的考虑,觉得使用哪个索引。

比如执行

select * from product where id =1

可以通过在查询语句前增加explain命令,就是输出这个sql语句的执行计划。

image

执行佳话站出来type为const, key 为primary 表示通过了主键索引

image
如果type为All 和key 为null, 这种查询扫描的方式效率是最低的

索引覆盖

image

当多个索引的时候,优化器会更具查询成本来决定使用哪个索引来执行查询操作。
比如上面的这个entrydate和id,执行计划的中extra显示using index表示为索引覆盖,只是用entrydate一个索引就可以返回结果
原因:
直接在二级索引上能查到结果,二级索引的B+树的叶子节点的数据存储的是主键值,没有必要在主键索引上继续查找了,因为查询主键索引B+树的成本会比查询二级索引的B+树的成本大,优化器基于查询成本的考虑,会选择代价更小的二级索引。

原文链接 (小林的网站)

posted on 2022-08-08 20:29  多一点  阅读(156)  评论(0编辑  收藏  举报

导航