zoukankan      html  css  js  c++  java
  • MySQL Multi-Range Read(MRR 索引多范围查找) 原理与解析

    原理:

    如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问。使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只是扫描索引,收集相关行的keys;然后,将收集到的keys进行排序;最后通过有序的主键去访问基表。

    Multi-Range Read特性的目的就是减少对磁盘的随机访问,进而对基表执行更多的顺序扫描。

    使用MRR后,执行计划中extra部分会显示"using mrr"

    -如果需要表进行全表扫描,innodb和myisam不使用mrr。
    -索引能覆盖的时候,mrr特性也用不上。
    -Multi-Range Read(MRR) 可以用于range、ref、eq_ref类型的查询。

    未开启MRR之前:由于MySQL存储数据的方式: 辅助索引的存储顺序并非与主键的顺序一致,从图中可以看出,根据辅助索引获取的主键来访问表中的数据会导致随机的IO。不同主键不在同一个page里面时必然导致多次IO和随机读。

    使用MRR之后:

    开启/关闭MRR

    1
    2
    set optimizer_switch='mrr=on mrr_cost_based=on'; #mrr_cost_based表示开启mrr后,优化器是否根据cost来决定是否使用mrr
    set oprimizer_switch='mrr=off';

    默认是开启MRR的。

    对于MRR,参数read_rnd_buffer_size用来控制键值缓冲区的大小。

  • 相关阅读:
    11.json
    10.正则表达式
    9.面向对象、类
    bzoj 2878: [Noi2012]迷失游乐园
    bzoj 2727: [HNOI2012]双十字
    bzoj 3224: Tyvj 1728 普通平衡树
    bzoj 3932: [CQOI2015]任务查询系统
    bzoj 1997: [Hnoi2010]Planar
    4 Django简介
    3 web框架
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/10796113.html
Copyright © 2011-2022 走看看