详解MySQL覆盖索引、索引下推

这篇具有很好参考价值的文章主要介绍了详解MySQL覆盖索引、索引下推。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.覆盖索引

1.1.概述

1.2.聚集索引、非聚集索引

1.3.回表查询

1.4.覆盖索引

2.索引下推


1.覆盖索引

1.1.概述

覆盖索引,是为了避免“回表查询”,从而降低查询耗时的一种使用索引的方法,所以要聊覆盖索引首先我们要知道什么是"回表查询,“回表查询”是因为MySQL的索引结构决定的,是因为非聚集索引要找聚集索引拿数据而出现的现象,所以我们又要先了解MySQL中的聚集索引和非聚集索引。

文章的脉络就是先聊聚集索引、非聚集索引是怎么带来了“回表查询”的问题,然后怎么用用覆盖索引解决这个问题。

1.2.聚集索引、非聚集索引

关于索引基础、B树、B+树等相关的详细内容可以看博主之前的两篇文章:

数据结构(8)树形结构——B树、B+树(含完整建树过程)_b+树构造过程__BugMan的博客-CSDN博客

详解MySQL索引__BugMan的博客-CSDN博客

众所周知mysql的索引有两种:

  • 聚集索引
  • 非聚集索引

聚集索引:

聚集索引的叶子节点上挂着的是一条分支上的所有索引对应的数据。

详解MySQL覆盖索引、索引下推

 MySQL会默认为每张表维护一个聚集索引,如果表有主键,那么这个聚集索引就是主键索引,如果没有主键,MySQL仍然会为每个表维护一个隐藏的聚集索引。在innodb引擎中,这个隐藏的聚集索引是一个6字节长的ROWID,每个数据行都会有一个隐藏的ROWID。

非聚集索引:

非聚集索引叶子结点上挂的是索引值和对应值指向的聚集索引的值,也就是说真正的数据一定是要找聚集索引拿的。

详解MySQL覆盖索引、索引下推

1.3.回表查询

上面聊完非聚集索引一定会找聚集索引拿数据后,其实“回表查询”问题就已经引出来了,所谓的“回表查询”,指的是当我们使用非聚集索引查询时我们是无法直接得到数据,而需要通过叶子结点上的聚集索引的值去聚集索引的B+树里查找数据的过程。

“回表查询”带来的问题一目了然,索引是存在磁盘上的,查完一棵B+树后,还要去查第二棵B+树进行遍历匹配,查第二棵B+树就带来了额外的IO耗时,磁盘IO本来就是磁盘旋转+磁头上下摆动的机械动作,这个动作在计算机的运行体系里是个极度慢的动作,极度的耗时。

1.4.覆盖索引

覆盖索引,指的是select具体字段代替select *,将复合索引建立在要查询的具体字段上,这样在非聚集索引上,也就是第一颗B+树上就能拿到数据,从而不用“回表查询”。

做个实验:

我建了一个sys_user表,里面随即插入了100万条数据:

详解MySQL覆盖索引、索引下推

然后在username上建立一个索引:

create index index_username on sys_user(username);

未使用覆盖索引查询其中一条数据:

explain select * from sys_user where username='test_852107';

详解MySQL覆盖索引、索引下推

使用覆盖索引查询其中一条数据:

explain select username from sys_user where username='test_852107';

 详解MySQL覆盖索引、索引下推

2.索引下推

索引下推,是自MySQL5.6版本引入的一个新特性,目的也是减少“回表查询”,从而提升整体的查询效率。

假设表中有三个字段name、age、sex,

SQL写成这样是没问题的,完美满足左前缀原则:

select * from tuser where name ='zou' and age=10 and sex=1;

但如果SQL写成这样,就会出问题,索引断开了,sex这个索引值是没有用上的:

select * from tuser where name ='zou' and sex=1;

在5.6之前索引断了就不会往下走了,匹配到的所有name='zou'的数据,挨个“回表”,无疑这将会造成很多无意义的额外IO开销:

详解MySQL覆盖索引、索引下推

而索引下推的意思是,索引断裂、走不下去后,不会立即回表,还会向下推一步再继续比较其它索引字段,从而减少无意义的额外IO。以上表为例,就是会匹配到name='zou'后发现索引断掉了也不会立即回表,而是继续向下比对sex是不是等于1:

详解MySQL覆盖索引、索引下推

 文章来源地址https://www.toymoban.com/news/detail-446343.html

到了这里,关于详解MySQL覆盖索引、索引下推的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL系列】-回表、覆盖索引真的懂吗

    在面试时常会被问一些概念性的东西。这些内容其实在开发中比较少用,但是为了显示你的知识储备你必须学习。博主最近在考Mysql认证时,也常碰到这样的问题。整理MySQL概念输出这篇博文。 1.1 索引的概念 MYSQL官方对索引的定义为:索引(Index)是帮助MySQL提高获取数据的数

    2024年02月12日
    浏览(35)
  • 【MySQL】MySQL索引详解

    文章中包含了: 1.什么是索引 2.索引的数据结构,以及各自的使用场景 3.为什么要设置主键自增? 4.基于主键索引和普通索引的查询有什么区别? 5.什么是回表 6.InnoDB 的索引模型 索引的使用就是为了提高查询数据的效率,就像书的目录一样 哈希表 哈希表是一种以键值存储的

    2024年02月14日
    浏览(44)
  • 特新介绍 | MySQL生态现有计算下推方案汇总

    作者:卢文双 资深数据库内核研发 本文首发于 2024-03-06 20:52:24 https://dbkernel.com 计算下推是数据库优化器优化查询性能的一种常见手段,早期的数据库系统提及的计算下推一般是指谓词下推,其理论源自关系代数理论。2000 年以后,随着 Oracle RAC 的盛行以及一众开源分布式数据

    2024年03月18日
    浏览(50)
  • sql--索引使用 ---覆盖索引

    Select 后接 * 走id索引才是最优,使用二级索引则需要回表(性能稍差) 前缀索引 Create index 索引名 on 表名( 字段名( n ) )   n数字   n代表提取这个字符串的n个构建索引 ??那么 n 为几性能是最好的呢? distinct 去重 Count 统计 Select count(*)from tb_user  -- 总数量 Select count( d

    2024年02月07日
    浏览(38)
  • MySQL-索引详解(四)

    ♥️ 作者:小刘在C站 ♥️ 个人主页: 小刘主页 ♥️ 每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 树高千尺,落叶归根人生不易,人间真情 前言 本次MySQL—索引章节比较多,分为多篇进行发布,本章继续

    2024年02月09日
    浏览(53)
  • MySQL-索引详解(三)

    ♥️ 作者:小刘在C站 ♥️ 个人主页: 小刘主页 ♥️ 每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 树高千尺,落叶归根人生不易,人间真情 目录 5.SQL性能分析 5.2 慢查询日志 测试: A. 执行如下SQL语句 :

    2024年02月08日
    浏览(36)
  • mysql联合索引详解

    比较简单的是单列索引(b+tree)。遇到多条件查询时,不可避免会使用到多列索引。联合索引又叫复合索引。 b+tree结构如下: 每一个磁盘块在mysql中是一个页,页大小是固定的,mysql innodb的默认的页大小是16k,每个索引会分配在页上的数量是由字段的大小决定。当字段值的长

    2024年02月14日
    浏览(32)
  • MySQL-索引详解(一)

    ♥️ 作者:小刘在C站 ♥️ 个人主页: 小刘主页 ♥️ 每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 树高千尺,落叶归根人生不易,人间真情 目录 索引 1 索引概述 1.1 介绍 2 演示 1). 无索引情况 2). 有索引情

    2024年02月08日
    浏览(24)
  • MySQL-索引详解(五)

    ♥️ 作者:小刘在C站 ♥️ 个人主页:  小刘主页  ♥️ 努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏: 云计算技术 ♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSD

    2024年02月09日
    浏览(32)
  • MySQL 索引失效详解

    一、MySQL索引失效原因汇总 隐式的类型转换,索引失效 查询条件包含or,可能导致索引失效 like通配符可能导致索引失效 查询条件不满足联合索引的最左匹配原则 在索引列上使用mysql的内置函数 对索引进行列运算(如,+、-、*、/) 索引字段上使用 (! = 或者 ),索引可能失效 索

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包