MySQL MRR

作者: 晚歌歌 | 来源:发表于2021-09-26 22:39 被阅读0次

    简介

    MRR,全称「Multi-Range Read Optimization」。
    简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能。

    命令

    mysql > set optimizer_switch='mrr=on';

    另外还有一个参数mrr_cost_based: on/off
    则是用来告诉优化器,要不要基于使用 MRR 的成本,考虑使用 MRR 是否值得(cost-based choice),来决定具体的 sql 语句里要不要使用 MRR。
    很明显,对于只返回一行数据的查询,是没有必要 MRR 的,而如果你把 mrr_cost_based 设为 off,那优化器就会通通使用 MRR,这在有些情况下是很 stupid 的,所以建议这个配置还是设为 on,毕竟优化器在绝大多数情况下都是正确的。

    开启前磁盘运动轨迹

    image.png

    先到左边的二级索引找,找到第一条符合条件的记录(实际上每个节点是一个页,一个页可以有很多条记录,这里我们假设每个页只有一条),接着到右边去读取这条数据的完整记录。

    读取完后,回到左边,继续找下一条符合条件的记录,找到后,再到右边读取

    开启后磁盘运动轨迹

    image.png

    对于 Innodb,则会按照聚簇索引键值排好序,再顺序的读取聚簇索引。

    优势

    1、磁盘和磁头不再需要来回做机械运动;
    2、可以充分利用磁盘预读
    3、在一次查询中,每一页的数据只会从磁盘读取一次

    相关文章

      网友评论

          本文标题:MySQL MRR

          本文链接:https://www.haomeiwen.com/subject/favcnltx.html