zoukankan      html  css  js  c++  java
  • Mysql性能优化:为什么要用覆盖索引?

    导读

    • 相信读者看过很多MYSQL索引优化的文章,其中有很多优化的方法,比如最佳左前缀,覆盖索引等方法,但是你真正理解为什么要使用最佳左前缀,为什么使用覆盖索引会提升查询的效率吗?

    • 本篇文章将从MYSQL内部结构上讲一下为什么覆盖索引能够提升效率。

    InnoDB索引模型

    • 在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。又因为前面我们提到的,InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的。

    • 每一个索引在InnoDB里面对应一棵B+树

    主键索引和非主键索引的区别

    • 主键索引又叫聚簇索引 ,非主键索引又叫普通索引,那么这两种索引有什么区别呢?

    • 主键索引的叶子节点存放的是整行数据,非主键索引的叶子节点存放的是主键的值。

    • 假设有一张User表(id,age,name,address),其中有id和age两个字段,其中id是主键,age是普通索引,有几行数据u1-u5的(id,age)的值是(100,1)、(200,2)、(300,3)、(500,5)和(600,6) ,此时的两棵树的示例如下:

    • 从上图可以看出来,基于主键索引的树的叶子节点存放的是整行User数据,基于普通索引age的叶子节点存放的是id(主键)的值。

    什么是回表?

    • 假设有一条查询语句如下:

      select * from user where age=3;
    • 上面这条sql语句执行的过程如下:

      1、根据age这个普通索引在age索引树上搜索,得到主键id的值为300。

      2、因为age索引树并没有存储User的全部数据,因此需要根据在age索引树上查询到的主键id的值300再到id索引树搜索一次,查询到了u3。

      3、返回结果。

    • 上述执行的过程中,从age索引树再到id索引树的查询的过程叫做回表(回到主键索引树搜索的过程)。

    • 也就是说通过非主键索引的查询需要多扫描一棵索引树,因此需要尽量使用主键索引查询。

    为什么使用覆盖索引?

    • 有了上述提及到的几个概念,便能很清楚的理解为什么覆盖索引能够提升查询效率了,因为少了一次回表的过程。

    • 假设我们使用覆盖索引查询,语句如下:

      select id from user where age=3;
    • 这条语句执行过程很简单,直接在age索引树中就能查询到id的值,不用再去id索引树中查找其他的数据,避免了回表。

    总结

    • 覆盖索引的使用能够减少树的搜索次数,避免了回表,显著提升了查询性能,因此覆盖索引是一个常用的性能优化手段。

    • 留给读者一个问题:身份证是一个人的唯一识别凭证,如果有根据身份证号查询市民信息的需求,我们只要在身份证号字段上建立索引就够了。而再建立一个(身份证号、姓名)的联合索引,是不是浪费空间?

  • 相关阅读:
    实例
    LR接口测试---webservices
    LR常用函数整理
    Codeforces Round #639 (Div. 2) A. Puzzle Pieces
    Codeforces Round #640 (Div. 4)全部七题
    POJ3177 Redundant Paths(e-DCC+缩点)
    洛谷P3469 [POI2008]BLO-Blockade(割点)
    洛谷P3275 [SCOI2011]糖果(缩点+拓扑序DP)
    POJ1236 Network of Schools(强连通分量)
    P3387 【模板】缩点(Tarjan求强连通分量)
  • 原文地址:https://www.cnblogs.com/Chenjiabing/p/12591343.html
Copyright © 2011-2022 走看看