广告
返回顶部
首页 > 资讯 > 数据库 >MySQL回表查询与索引覆盖的区别
  • 519
分享到

MySQL回表查询与索引覆盖的区别

MySQL回表查询与索引覆盖 2023-03-20 14:03:03 519人浏览 独家记忆
摘要

目录回表查询索引覆盖索引下推回表查询 InnoDB索引分为两大类,一类是聚集索引(Clustered Index),一类是非聚集索引(Secondary Index) 聚集索引(聚簇

回表查询

InnoDB索引分为两大类,一类是聚集索引(Clustered Index),一类是非聚集索引(Secondary Index)

聚集索引(聚簇索引):叶子节点中存的是整行数据,找到索引也就找到了数据,索引即数据,表中行的物理顺序与键值的逻辑(索引)顺序相同,一个表只能包含一个聚集索引。因为索引(目录)只能按照一种方法进行排序

非聚集索引(普通索引、非聚簇索引、二级索引):非聚集索引的btree叶子节点中存储的是当行数据的PK(主键)。例如MYISAM通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。

为什么非主键索引结构叶子结点存储的是主键值?

减少了出现行移动或者数据页分裂时二级索引的维护工作(当数据需要更新的时候,二级索引不需要修改,只需要修改聚簇索引,一个表只能有一个聚簇索引,其他的都是二级索引,这样只需要修改聚簇索引就可以了,不需要重新构建二级索引)

在使用非聚集索引时,为了取到具体数据,则需要通过PK回到聚集索引里去查询数据。着就叫回表查询。扫描了2次索引树。所以效率相对较低。

索引覆盖

索引覆盖就是解决回表查询的一种方案。见名知意,就是查询的所有列均被所使用的索引列覆盖(可以是单列索引也可以是联合索引,通常是联合索引,单列索引很难覆盖查询的所有列)。

因为索引中已经包含了要查询的字段的值,因此查询的时候直接返回索引中的字段值就可以了,不需要再到表中查询,避免了对主键索引的二次查询,也就提高了查询的效率。

id为聚集索引,name为非聚集索引:

select name, age from t where name = 'lcc';

就需要回表查询

索引覆盖:

sql中只查询name字段。这样name的索引就覆盖到了所有的查询列。

select name  from t where name = 'lcc';

将name的索引修改为联合索引(name, age ),之后还是执行select name, age from t where name = 'lcc'。这样也覆盖到了所有的查询列。
因为覆盖索引必须要存储索引的列值,而哈希索引、空间索引和全文索引等都不存储索引列值,从而只有使用B-Tree索引的数据可以做覆盖索引。

进行索引覆盖查询时,在explain(执行计划)的Extra列可以看到【Using Index】的信息。

索引覆盖的优点

  • 索引条目通常远小于数据行的大小,因为覆盖索引只需要读取索引,极大地减少了数据的访问量。
  • 索引是按照列值顺序存储的,对于io密集的范围查找会比随机从磁盘读取每一行数据的IO小很多。
  • 一些存储引擎比如MyISAM在内存中只缓存索引,数据则依赖操作系统来缓存,因此要访问数据的话需要一次系统调用,使用覆盖索引则避免了这一点。
  • 由于InnoDB的聚簇索引,覆盖索引对InnoDB引擎下的数据库表特别有用。因为InnoDB的二级索引在叶子节点中保存了行的主键值,如果二级索引能够覆盖查询,就避免了对主键索引的二次查询。

哪些场景适合使用索引覆盖来优化SQL

  • 当不需要查询整行记录时;
  • 全表count查询优化;
  • Limit分页查询;

哪些情况下不要建索引

  • 表记录太少
  • 经常增删改的表或者字段(如用户余额)
  • Where条件里用不到的字段不创建索引
  • 过滤性不好的不适合建索引(如性别)

索引下推

索引下推优化是 Mysql 5.6 引入的, 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

建立联合索引:

KEY `username` (`name`,`age`) )

执行:

select * from user2 where name like 'j%' and age=99;

上面的查询sql符合索引的最左前缀原则,所以将会用到 username 索引

5.5中上面这个 SQL 的执行流程是这样的:

  • 首先 mysql 的 server 层调用存储引擎获取第一个以 j 开头的 username。
  • 存储引擎找到 username=‘j’ 的第一条记录后,在 B+Tree 的叶子结点中保存着主键 id,此时通过回表操作,去主键索引中找到该条记录的完整数据,并返回给 server 层。
  • server 层拿到数据之后,判断该条记录的 age 是否为 99,如果 age=99,就把该条记录返回给客户端,如果 age!=99,那就就丢弃该记录。

 5.6中上面这个 SQL 的执行流程是这样的:

  • MySQL 的 server 层首先调用存储引擎定位到第一个以 j 开头的 username。
  • 找到记录后,存储引擎并不急着回表,而是继续判断这条记录的 age 是否等于 99,如果 age=99,再去回表,如果 age 不等于 99,就不去回表了,直接继续读取下一条记录。

 到此这篇关于MySQL回表查询与索引覆盖的区别的文章就介绍到这了,更多相关MySQL回表查询与索引覆盖内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL回表查询与索引覆盖的区别

本文链接: https://www.lsjlt.com/news/200557.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL回表查询与索引覆盖的区别
    目录回表查询索引覆盖索引下推回表查询 InnoDB索引分为两大类,一类是聚集索引(Clustered Index),一类是非聚集索引(Secondary Index) 聚集索引(聚簇...
    99+
    2023-03-20
    MySQL回表查询与索引覆盖
  • MySQL回表查询与索引覆盖的区别是什么
    这篇文章主要介绍“MySQL回表查询与索引覆盖的区别是什么”,在日常操作中,相信很多人在MySQL回表查询与索引覆盖的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL回表查询与索引覆盖的区别...
    99+
    2023-07-05
  • mysql 14 覆盖索引+回表
    覆盖索引概念:     MySQL可以利用索引返回select列表中的字段值(就是索引值)。而不必根据主键再次读取聚簇索引数据文件查到数据,也就是平时所说的不需要回表操作。覆盖索引其实是索引覆盖的意思,索引字段就已经囊括selec...
    99+
    2020-11-10
    mysql 14 覆盖索引+回表 数据库入门 数据库基础教程 数据库 mysql
  • MySQL回表,覆盖索引,索引下推
    目录回表覆盖索引索引下推无索引下推: 查看索引下推的状态有索引下推: 开启索引下推回表 在研究mysql二级索引的时候,发现Mysql回表这个操作,往下研究了一下 字面意思,找到索引...
    99+
    2022-11-13
  • MySQL 回表,覆盖索引,索引下推
    目录回表覆盖索引索引下推无索引下推: 查看索引下推的状态有索引下推: 开启索引下推回表 在研究mysql二级索引的时候,发现Mysql回表这个操作,往下研究了一下 字面意思,找到索引,回到表中找数据 解释一下就是: 先通...
    99+
    2022-07-11
    MySQL回表 MySQL覆盖索引 MySQL索引下推
  • MySQL的覆盖索引与回表是怎样的
    今天就跟大家聊聊有关MySQL的覆盖索引与回表是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。两大类索引使用的存储引擎:MySQL5.7 In...
    99+
    2022-10-19
  • MySQL 的覆盖索引与回表的使用方法
    两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚...
    99+
    2022-10-18
  • 【MySQL系列】-回表、覆盖索引真的懂吗
    【MySQL系列】-回表、覆盖索引真的懂吗 文章目录 【MySQL系列】-回表、覆盖索引真的懂吗一、MYSQL索引结构1.1 索引的概念1.2 索引的特点1.3 索引的优点1.4 索引的缺点 二、B-Tree与B+Tree2....
    99+
    2023-08-21
    mysql 数据库
  • MySQL中复合索引和覆盖索引的区别详解
    目录前言准备复合索引覆盖索引总结前言准备 我们先准备一张表和几个字段,方便介绍覆盖索引和复合索引。 创建一个user表,表中有id、name、school、age字段。 字段名字段类型idintnamevarcharsc...
    99+
    2023-11-23
    MySQL 复合索引 MySQL 覆盖索引
  • MySQL中的回表和索引覆盖示例详解
    目录索引类型索引结构非聚簇索引查询索引覆盖总结索引类型 聚簇索引: 叶子节点存储的是行记录,每个表必须要有至少一个聚簇索引。使用聚簇索引查询会很快,因为可以直接定位到行记录 普通索引...
    99+
    2022-11-12
  • 如何通过索引提升PHP与MySQL的联合索引和覆盖索引查询效率?
    随着互联网的发展和数据量的增加,数据库的性能优化变得越来越重要。索引是提升数据库查询性能的一种重要手段。在PHP与MySQL的应用中,通过合理使用联合索引和覆盖索引,可以大幅度提升查询效率。本文将介绍如何使用联合索引和覆盖索引进行查询优化,...
    99+
    2023-10-21
    MySQL PHP 索引 关键词:
  • Swoole和Workerman对PHP与MySQL的索引扫描和索引覆盖查询的优化方法
    引言:在大规模的Web应用中,数据库查询的性能优化是至关重要的。索引是一种非常有效的优化手段之一,可以加快查询的速度。针对PHP与MySQL的索引扫描和索引覆盖查询,本文将介绍如何使用Swoole和Workerman来进行优化,并提供具体的...
    99+
    2023-10-21
    优化方法 Workerman 关键词:swoole
  • mysql可以查询表中的索引吗
    mysql可以查询表中的索引,实现方式有:1、DESC指令,显示表的结构信息,包括索引,命令示例“DESC 表名;”;2、SHOW INDEX指令,展示表的索引信息,命令示例“SHOW INDEX FROM 表名”;3、INFORMATIO...
    99+
    2023-07-25
  • 如何通过索引优化PHP与MySQL的多表查询?
    在开发Web应用程序时,经常会涉及到与数据库进行交互的操作,尤其是对于关系型数据库来说,多表查询是非常常见的操作。然而,当数据量过大,查询复杂度增加时,多表查询的性能可能会受到一定的影响。为了提高查询效率,我们可以通过优化索引来进行调整。索...
    99+
    2023-10-21
    MySQL PHP 索引优化 多表查询
  • MySQL中的B-Tree引索与Hash引索有区别吗
    MySQL中的B-Tree引索与Hash引索有区别吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MySQL中B-Tree引索...
    99+
    2022-10-18
  • mysql使用from与join两表查询的区别总结
    前言 在mysql中,多表连接查询是很常见的需求,在使用多表查询时,可以from多个表,也可以使用join连接连个表 这两种查询有什么区别?哪种查询的效率更高呢? 带着这些疑问,决定动手试...
    99+
    2022-10-18
  • 如何通过索引优化PHP与MySQL的跨表查询和跨数据库查询?
    引言:在面对需要处理大量数据的应用程序开发中,跨表查询和跨数据库查询是不可避免的需求。然而,这些操作对于数据库的性能来说是非常消耗资源的,会导致应用程序变慢甚至崩溃。本文将介绍如何通过索引优化PHP与MySQL的跨表查询和跨数据库查询,从而...
    99+
    2023-10-21
    MySQL PHP 索引优化
  • Mysql 索引 BTree 与 B+Tree 的区别(面试)
    目录前言BTree 基本概念B+Tree 的特点查找过程的区别B+Tree索引 如何提高索引的查询性能 ?前言 ​ 说起面试,很多同学都经历过,但是 面试中 可能会遇到各种问题,mysql 的问题 也是非常多,最近我也经...
    99+
    2022-09-27
  • Mysql 索引 BTree 与 B+Tree 的区别(面试)
    目录前言BTree 基本概念B+Tree 的特点查找过程的区别B+Tree索引 如何提高索引的查询性能 ?前言 ​ 说起面试,很多同学都经历过,但是 面试中 可能会遇到各种问题,My...
    99+
    2022-11-13
  • MySQL中的组合索引与单列索引的区别有哪些
    本篇内容介绍了“MySQL中的组合索引与单列索引的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作