小林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+树的成本大,优化器基于查询成本的考虑,会选择代价更小的二级索引。

原文链接 (小林的网站)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值