Mysql性能优化:为什么要用覆盖索引?

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

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) ,此时的两棵树的示例如下:

Mysql性能优化:为什么要用覆盖索引?

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

 

什么是回表?

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

  select * from user where age=3;

代码100分

  • 上面这条sql语句执行的过程如下:

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

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

    3、返回结果。

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

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

 

为什么使用覆盖索引?

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

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

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

 

总结

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

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9310.html

(0)
上一篇 2023-02-11
下一篇 2023-02-11

相关推荐

  • MySQL快速回顾:高级查询操作「建议收藏」

    MySQL快速回顾:高级查询操作「建议收藏」8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到M

    2023-01-23
    106
  • Docker-compose常用软件部署(mysql、redis、rabbitmq)

    Docker-compose常用软件部署(mysql、redis、rabbitmq) Docker-compose常用软件部署(mysql、redis、rabbitmq) 废话不多说,下面就直接给出部署文件已经启动脚本,这个会持续更新。以下的部署方式均是单例部署。高可用或者其…

    2023-03-23
    94
  • 使用plsql编程「建议收藏」

    使用plsql编程「建议收藏」第七章 使用PL/SQL编程 初识PL/SQL(Procedure Language & Structured Query Language) PL/SQL是Oracle在标准SQL语言上的过

    2023-02-04
    97
  • mysql压测_压测工具jmeter

    mysql压测_压测工具jmeter 目录 bmsql工具简介 bmsql全称BenchMarkSQL 目前支持postgres bmsql工具使用方法 压测步骤 ./runDatabaseBuild.sh liurong-71…

    2023-03-22
    103
  • jdbc详细教程_javaweb笔记

    jdbc详细教程_javaweb笔记但是在实际的业务中,通常是多条 DML语句 联合完成的,那么就必须保证这些 DML语句 在同一个事务中同时成功或失败……

    2023-05-03
    97
  • 初步体验Oracle[亲测有效]

    初步体验Oracle[亲测有效]Oracle 与Mysql 对比: MySQL: 免费;小型企业;仅是数据库;轻 Oracle:收费, 中大型企业;数据库服务(权限,并发,事务,一致性);更适合集群;重 共同点:都属于关系型数据库

    2023-02-05
    89
  • Python自定义函数的实现和应用

    Python自定义函数的实现和应用Python作为一种高级编程语言,其自带的函数库已经十分强大,可以满足很多开发者的需求。不过在实际的程序开发中,我们常常需要自定义一些函数以满足我们的具体需求。本文将从以下几个方面来介绍Python自定义函数的实现和应用:

    2024-03-06
    39
  • sql是如何在数据库中执行的_数据库执行脚本

    sql是如何在数据库中执行的_数据库执行脚本
    对很多开发者来说,数据库就是个黑盒子,你会写 SQL,会用数据库,但不知道盒子里面到底是怎么一回事儿,这样你只能机械地去记住别人告诉你的那些优化规则,却不知…

    2023-04-06
    105

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注