MySQL的sql优化涉及的概念

  1. B+树索引
    在谈到MySQL时,默认使用的存储引擎为innodb。而innodb组织数据的方式为B+树,即表就是索引,索引就是表。准确来说表是主键索引所在的B+数。

简单介绍一下B+树

  • B+树是一棵M叉的平衡树,由根节点、分支节点和叶子节点组成。
  • 根节点和分支节点不存储具体的值,只存储索引的键。
  • 叶子节点存储键和值,键位索引字段,如果是主键索引,则值为除主键以外的所有字段值,如果是二级索引,则值为主键。
  • 从根节点到任何一个叶子节点的距离都是一样。

例如有如下表

主键索引大致结构如下

二级索引大致结构如下

  1. sql执行经历的组件
  • 连接器 负责连接管理,只有跟服务器建立了连接才能向服务器发送sql
  • 查询缓存 如果待执行的sql之前已经执行过,则直接从查询缓存中返回sql执行结果,从而避免了后续的执行步骤。5.7查询缓存默认为关闭状态。8.0直接从代码层面删除了查询缓存
  • 分析器 对sql语句进行语法和语义分析,如果没有错误则会生成一颗语法树
  • 优化器 对上一步生成的语法树进行解析,一条sql可能有多种不同的执行路径,从中选择一个最佳的路径作为执行计划
  • 执行器 执行器根据优化器生成的执行计划执行并返回执行结果
  1. 执行计划
    执行计划描述了如何从存储引擎获取数据,表之间如何做关联,以及如何过滤数据等等。要获取执行计划可以通过DESC SQL或EXPLAIN SQL命令

mysql> desc select * from emps e where e.emp_no desc format=json select * from emps e where e.emp_no desc format=tree select * from emps e where e.emp_no Filter: (e.emp_no Table scan on e (cost=30956.70 rows=299637) | +-----------------------------------------------------------------------------------------------------------------+