mysql策略实现原理杂记

12月 7, 2021 |

Condition Filtering

对外层表access method选出的行,在传给内存join前,执行条件过滤(explain filtered列),这个过滤基于统计有时不准

range optimization

索引range scan没有where严格,从where中提取某个索引的range条件。
比如:
(key_part1 = 1 AND key_part2 < 2) OR (key_part1 > 5)
提取结果为:

Equality Range

形如col_name IN(val1, ..., valN) 如果col_name有唯一索引,那么每个值预估匹配行=1。
如果非唯一索引,那么值个数<eq_range_index_dive_limit 执行索引挖掘,否则使用索引统计

MRR

Multi-Range Read,扫描secondary index的时候,将row id累积在join buffer中,对join buffer中的row id排序后去base table顺序查找。

Index Condition Pushdown

形如:
select where keyPart1=N and keyPart2>M
特征:

  1. keyPart1,keyPart2是secondary indexes(非聚簇索引) 且是复合索引的两部分
  2. kerPart1区分度很低、keyPart2是【不等比较,范围,like形式】
  3. 需要回表查询数据列(不回表为覆盖索引)

执行思路
那么将where条件推入存储引擎层,在扫描secondary indexes的时候过滤不满足条件的行,减少回表IO
explain extra column Using index condition
index_condition_pushdown=off 或者NO_ICP优化器hint关闭

Posted in: database | Tags:

Comments are closed.