mysql执行原理

127 阅读2分钟

单表访问之索引合并

mysql在一般情况下执行一个查询时最多只会用到单个二级索引,但存在特殊情况,也可能在一个查询中使用到多个二级索引,此时会出现索引合并。

Intersection合并

  1. 根据二级索引查询
  2. 从两个二级索引中的到主键(id)的交集
  3. 最后根据主键ID,进行回表操作

Intersection合并条件

  1. 等值匹配(二级索引),查询条件必须等值
  2. 主键列可以进行范围匹配
  3. 联合索引的情况下,所有索引都要添加,作为条件。

Union合并

Sort-Union合并

连接查询原理

连接查询的本质就是做笛卡尔积。 连接查询中,第一个确定查询表的叫驱动表

两表连接的过程

  1. 确定驱动表
  2. 便利驱动表结果,到被驱动表中查找匹配记录

驱动表只需要访问一次,被驱动表可能被访问多次

使用索引可以加快连接速度

join buffer 需要开启

show variables like 'join_buffer_size'

加入缓存的数据也只是主键和关联的字段。

执行成本

I/O成本(1.0) CPU成本(0.2)

基于成本的优化步

  1. 根据搜索条件,找出所有可能使用的索引
  2. 计算全表扫描的代价
  3. 计算使用不同索引执行查询的代价
  4. 对比各种执行方案的代价,找除成本最低的那一个

Optimizer trance

show variables like 'optimizer_trace'

设置开启

set optimizer_trace='enabled=on'

select * from information_schema.OPTIMIZER_TRACE\G

两表连接查询的成本计算

  1. 单次查询驱动表的成本
  2. 多次查询被驱动表的成本

简单运算优化,复杂的无法优化。