1.ICP

  • Index Condition Pushdown(ICP)是MySQL使用索引从表中检索行数据的一种优化方式,从MySQL5.6之后开始支持
  • 5.6之前存储引擎会通过遍历索引定位基表中的行,然后返回给Server层,再去为这些数据行进行WHERE后的条件过滤
  • 支持ICP后,如果WHERE条件可以使用索引,MySQL会把这部分过滤操作放到存储引擎层,存储引擎通过索引过滤,把满足的行从表中读取出。ICP能减少引擎层访问基表的次数和Server层访问存储引擎的次数。

    2.MRR

  • MRR全称是Multi-Range Read Optimization,这也是5.6之后才有的。

  • MySQL普通索引获取数据的方式,是通过索引页的叶子节点找到对应的主键,再通过主键找到相对应的行数据记录。如果一张表中对某一个字段创建一个普通索引,但这个字段有一些重复的值,那么根据这个字段去做where条件时,每次取到的主键值可能就不是按顺序的,那么随机I/O行为就会发生。
  • MMR的作用就是把普通索引的叶子结点上找到的主键值的集合存储到 read_rnd_buffer中,然后在该buffer中对主键值进行排序,最后再利用已经排序好的主键值的集合,去访问表中的数据,这样就将随机I/O变成顺序I/O,降低了查询过程中的I/O开销

    3.BKA

  • BKA全称为Batched Key Access。它是提高表join性能的算法,其作用是读取被join表的记录的时候使用顺序I/O

  • 原理是:对于多表join语句,当MySQL使用索引访问第二个join表时,使用一个join buffer来收集第一个操作对象生成的相关列值。BKA建好key后,批量传给引擎层做索引查找。key是通过MRR接口提交给引擎的,这样依赖MRR使得查询更加高效。