服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQLl优化:为什么要用覆盖索引?

MySQLl优化:为什么要用覆盖索引?

2023-09-23 02:55未知服务器之家 Mysql

引言: 覆盖索引是一种利用二级索引的叶子节点包含了所有需要查询的列数据,从而避免回表操作的查询方式。回表操作是指通过二级索引找到主键值,再根据主键值在聚簇索引中查找完整的记录。回表操作会增加磁盘的随机IO,

引言:

覆盖索引是一种利用二级索引的叶子节点包含了所有需要查询的列数据,从而避免回表操作的查询方式。回表操作是指通过二级索引找到主键值,再根据主键值在聚簇索引中查找完整的记录。回表操作会增加磁盘的随机IO,降低查询效率。使用覆盖索引可以减少树的搜索次数,提升查询性能。

先了解三个概念:

InnoDB索引模型:

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

MySQLl优化:为什么要用覆盖索引?

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

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

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

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

MySQLl优化:为什么要用覆盖索引?

从上图可以看出来,基于主键索引的树的叶子节点存放的是整行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索引树中查找其他的数据,避免了回表。

总结:

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


延伸 · 阅读

精彩推荐
  • MysqlMySQL解决SQL注入的另类方法详解

    MySQL解决SQL注入的另类方法详解

    这篇文章主要介绍了MySQL解决SQL注入的另类方法,结合实例形式列举分析了几种防止SQL注入的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    OurMySQL2682020-06-06
  • MysqlMySQL Binlog 日志处理工具对比分析

    MySQL Binlog 日志处理工具对比分析

    这篇文章主要介绍了MySQL Binlog 日志处理工具对比分析的相关资料,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下...

    stone-no14242021-05-03
  • Mysql浅析一个MYSQL语法(在查询中使用count)的兼容性问题

    浅析一个MYSQL语法(在查询中使用count)的兼容性问题

    本篇文章是对MYSQL语法(在查询中使用count)的兼容性问题进行了详细的分析介绍,需要的朋友参考下 ...

    MYSQL教程网2252020-01-05
  • MysqlMySQL数据库varchar的限制规则说明

    MySQL数据库varchar的限制规则说明

    本文我们主要介绍了MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,希望能够对您有所帮助。 ...

    mysql技术网4062019-11-23
  • MysqlMYSQL配置参数优化详解

    MYSQL配置参数优化详解

    MySQL是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验 进行判断,然后设置合理的参数。下面我们...

    清酒故人3682019-07-01
  • MysqlMysql数据库性能优化一

    Mysql数据库性能优化一

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序...

    邹琼俊3942020-06-03
  • Mysqlmysql命令行爱好者必备工具mycli

    mysql命令行爱好者必备工具mycli

    这篇文章主要介绍了mysql命令行爱好者必备工具mycli的相关知识,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下...

    MYSQL教程网2572020-09-23
  • Mysql解决重置Mysql root用户账号密码问题

    解决重置Mysql root用户账号密码问题

    这篇文章主要介绍了解决重置Mysql root用户账号密码问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    授客2512020-12-06