单表访问之索引合并
mysql在一般情况下执行一个查询时最多只会用到单个二级索引,但存在特殊情况,也可能在一个查询中使用到多个二级索引,此时会出现索引合并。
Intersection合并
- 根据二级索引查询
- 从两个二级索引中的到主键(id)的交集
- 最后根据主键ID,进行回表操作
Intersection合并条件
- 等值匹配(二级索引),查询条件必须等值
- 主键列可以进行范围匹配
- 联合索引的情况下,所有索引都要添加,作为条件。
Union合并
Sort-Union合并
连接查询原理
连接查询的本质就是做笛卡尔积。 连接查询中,第一个确定查询表的叫驱动表
两表连接的过程
- 确定驱动表
- 便利驱动表结果,到被驱动表中查找匹配记录
驱动表只需要访问一次,被驱动表可能被访问多次
使用索引可以加快连接速度
join buffer 需要开启
show variables like 'join_buffer_size'
加入缓存的数据也只是主键和关联的字段。
执行成本
I/O成本(1.0) CPU成本(0.2)
基于成本的优化步
骤
- 根据搜索条件,找出所有可能使用的索引
- 计算全表扫描的代价
- 计算使用不同索引执行查询的代价
- 对比各种执行方案的代价,找除成本最低的那一个
Optimizer trance
show variables like 'optimizer_trace'
设置开启
set optimizer_trace='enabled=on'
select * from information_schema.OPTIMIZER_TRACE\G
两表连接查询的成本计算
- 单次查询驱动表的成本
- 多次查询被驱动表的成本
简单运算优化,复杂的无法优化。