什么是聚簇索引和非聚簇索引,如何理解回表、索引下推

news2024/11/17 8:46:16

聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)是数据库中的两种索引类型,它们在组织和存储数据时有不同的方式。

聚簇索引

聚簇索引简单理解就是将数据与索引放在一起,找到索引即找到了数据。换句话说,对于聚簇索引,其非叶子节点上存储的是索引字段的值,而叶子节点上存储的是对应记录的整行数据。

image.png

在 InnoDB 中,聚簇索引(Clustered Index)是指按照每张表的主键构建的一种索引方式。它将表数据按照主键的顺序存储在磁盘上,确保了行的物理存储顺序与主键的逻辑顺序相同。这种索引方式使得查找聚簇索引的速度非常快。

非聚簇索引是指将索引与数据分开存储的一种方式。在非聚簇索引中,叶子节点包含索引字段的值以及指向数据页数据行的逻辑指针。

image.png

在 InnoDB 中,非聚簇索引(Non-clustered Index)是根据非主键字段创建的索引,通常称为二级索引。它不影响表中数据的物理存储顺序,而是单独创建一张索引表,用于存储索引列和对应行的指针。

在 InnoDB 中,主键索引就是聚簇索引,而非主键索引则是非聚簇索引。因此,在 InnoDB 中:

  • 对于聚簇索引,其非叶子节点上存储的是索引值,而叶子节点上存储的是整行记录。
  • 对于非聚簇索引,其非叶子节点上存储的是索引值,而叶子节点上存储的是主键的值以及索引值。

因此,通过非聚簇索引进行查询时,需要进行一次回表操作,即先通过索引查找到主键 ID,然后再通过 ID 查询所需字段。

没有创建主键怎么办?

在 InnoDB 中,如果表结构中没有定义主键,数据库会自动为每行记录添加一个隐藏的主键,通常称为 db_row_id 字段。这个隐藏主键会确保每行记录都有一个唯一的标识符。

如果表中没有合适的唯一索引可用作聚簇索引,数据库会使用这个隐藏主键来构建聚簇索引。这样可以确保每行记录都有一个物理上的唯一标识符,并且能够保持索引的唯一性和快速查询的特性。

扩展知识

我们刚刚又提到回表的概念,什么是回表呢?

什么是回表,怎么减少回表的次数?

在 InnoDB 中,索引 B+树的叶子节点存储了整行数据的是主键索引,也被称为聚簇索引。而索引 B+树的叶子节点存储了主键的值的是非主键索引,也被称为非聚簇索引。

在数据存储方面,主键(聚簇)索引的 B+树的叶子节点直接包含了我们要查询的整行数据。而非主键(非聚簇)索引的叶子节点则包含了主键的值。

因此,当我们通过非聚簇索引进行查询时,首先会通过非聚簇索引查找到主键的值,然后需要再通过主键的值进行一次查询才能获取到我们要查询的数据。这个过程称为回表。

因此,在 InnoDB 中,使用主键进行查询效率更高,因为这个过程不需要回表。此外,通过依赖覆盖索引、索引下推等技术,我们可以通过优化索引结构和 SQL 语句来减少回表的次数。

什么是索引覆盖、索引下推?

覆盖索引

覆盖索引是指查询语句的执行只需从索引中获取所需数据,而无需从数据表中读取。也可以称之为实现了索引覆盖。

当一条查询语句符合覆盖索引条件时,MySQL 只需通过索引就能返回查询所需数据,而不需要进行索引查找后再返回表操作,从而减少 I/O,提高效率。

例如,在表 covering_index_sample 中有一个普通索引 idx_key1_key2(key1,key2)。

当我们执行以下 SQL 语句时:

SELECT key2 FROM covering_index_sample WHERE key1 = 'keytest';

此时可以通过覆盖索引查询,无需进行回表操作。

但是对于以下 SQL 语句,虽然是索引覆盖,但由于不符合最左前缀匹配,无法利用索引(会扫描索引树):

SELECT key1 FROM covering_index_sample WHERE key2 = 'keytest';

另外,如果查询语句中需要的信息不包含在联合索引中,那么就无法使用索引覆盖。例如:

SELECT key2, key3 FROM covering_index_sample WHERE key1 = 'keytest';
索引下推

索引下推是 MySQL 5.6 引入的一种优化技术,默认开启,可通过设置 SET optimizer_switch = 'index_condition_pushdown=off'; 来关闭。

它的工作原理如下:假设 people 表中(zipcode,lastname,firstname)构成一个索引。考虑以下查询:

SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';

如果没有使用索引下推技术,MySQL 会通过 zipcode='95054'从存储引擎中查询对应的数据,然后将结果返回到 MySQL 服务端,接着 MySQL 服务端再基于lastname LIKE '%etrunia%' 和 address LIKE '%Main Street%'来判断数据是否符合条件。

而如果使用了索引下推技术,MySQL 首先会返回符合 zipcode='95054'的索引,然后根据lastname LIKE '%etrunia%'来判断索引是否符合条件。如果符合条件,则根据该索引定位对应的数据;如果不符合,则直接拒绝。有了索引下推优化,可以在有 like 条件查询的情况下,减少回表次数。

当一条 SQL 使用到索引下推时,执行计划中的 extra 字段的内容会显示为 "Using index condition"

索引下推不止 like

上面的例子中,提到了 like,包括 MySQL 官网中也只提到了 like,但是其实不止有 Like。因为我认为索引下推其实是解决索引失效带来的效率低的问题的一种手段

所以当联合索引中,某个非前导列因为索引失效而要进行扫表并回表时,就可以进行索引下推优化了。

如,有 a,b 联合索引,类型都是 varchar,以下 SQL 也可以用到索引下推:

select d from t2 where a = "ni" and b = 1;

因为 b 字段因为类型不匹配导致索引失效了,但是通过下推优化其实是可以减少回表的次数的。

如有问题,欢迎微信搜索【码上遇见你】。

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1697723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Qt 界面上字体自适应控件大小 - 随控件缩放

Qt 界面上字体自适应控件大小 - 随控件缩放 引言一、设计思路二、进阶版大致思路三、参考链接 引言 Qt控件自适应字体大小可以用adjustSize()函数,但字体自适应控件大小并没有现成的函数可调. - 本文实现了按钮上的字体随按钮大小变化而变化 (如上图所示) - 其他控件…

[CISCN2024]-PWN:gostack解析(go语言程序,syscall)

查看保护 ida比较复杂,建议动调配合静态分析程序运行 这里函数返回不用leave和ret,而是利用add rsp和ret,所以要动调查看到底要覆盖哪里。 完整exp: from pwn import* pprocess(./gostack) syscall0x4616c9 pop_rax0x40f984 po…

电子电器架构 - AUTOSAR ON THE AIR

电子电器架构 - AUTOSAR ON THE AIR 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

C# 控制台应用模板可生成顶级语句

C# 控制台应用模板可生成顶级语句 项目2024/01/0810 个参与者 反馈 本文内容 使用新的程序样式隐式 using 指令全局 using 指令使用旧程序样式 从 .NET 6 开始,新 C# 控制台应用的项目模板在 Program.cs 文件中生成以下代码: C#复制 // See https…

C语言基础(六)

C语言基础 指针与一维数组总结 * p、* (p)、(\*p)、* p、*(p)、*p区别和用法运算优先级p与p区别*p与 *(p)与(*p)*p与 *(p)与 *p 指针常量与一维数组的关系指针变量与一维数组的关系数…

基于FIDO2和USBKEY硬件的SSH认证

在 8.2(最新为 8.3)版本中,OpenSSH 提供了对 FIDO 和 UAF 的支持。从此用户就可以用硬件 USBKEY 证书进行 SSH 原生认证。这样可以实现简捷、有效和安全的 SSH 认证。本文我们就就少一下 FIDO2 以及 OpenSSH 对其的支持,并尝试一下…

十大排序 —— 冒泡排序

十大排序 —— 冒泡排序 什么是冒泡排序基本步骤特点 优化冒泡的各项性能时间复杂度空间复杂度稳定性总结 我们今天来讲一个大家熟悉的老朋友——冒泡排序: 什么是冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,因其工作…

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型 前言 整了一个在C# Winform中调用文生图Stable Diffusion XL的小程序,基于百度智能云千帆平台 步骤 如何注册百度智能云和创建应用,获取API 密钥等和在之前的博客中基本相同&#…

单日收益1000+看了就会的项目,最新灵异短视频项目,简单好上手可放大操作

各位好友,佳哥在此与大伙儿聊聊一项神秘莫测的短视频项目。你或许会想,“又是一个视频创作项目?” 但别急,这个项目与众不同,日入千元不再是梦,而且它的易用性让人惊喜,无论你是初学者还是资深玩…

面向对象------多态

1.多态的定义 通俗来说,当同一种行为或者事情发生在不同的对象上,这些行为或者事情最终得到的结果不同。 注意:多态要发生在继承的基础上。 例如:彩色打印机和黑白打印机。 彩色打印机和黑白打印机是不同的对象,但…

兵器室管控系统|DW-306是一套成熟系统

概述 智慧兵器室管理系统(DW-S306)是依托互3D技术、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本解决方案利用现有内部网络,部署部队智能兵器室管理系统&#xff…

Python并发编程学习记录

1、初识并发编程 1.1、串行,并行,并发 串行(serial):一个cpu上按顺序完成多个任务; 并行(parallelism):任务数小于或等于cup核数,多个任务是同时执行的; 并发(concurrency):一个…

小浪助手下载学浪视频的简单步骤

你是否想轻松下载学浪高清视频?快来尝试小浪助手,这是你不可错过的下载神器!简单几步操作,即可轻松下载你所需的学浪视频,节省时间,提高效率! 首先我已经打包好了小浪助手,有需要的…

DOS学习-目录与文件应用操作经典案例-attrib

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统中的attrib命令是一个用于显示或更改文件&#…

内网渗透—SMB隧道正反向连接防火墙规则绕过CS上线

1、前言 这篇文章主要是说一下这个用于横向移动的SMB隧道,已经如何使用smb隧道去进行横向移动。 2、实验环境 实验环境和上一篇的差不多,主要是加了个防火墙。 windows server2012 192.168.145.131(外网) 192.168.22.134&…

【NumPy】关于numpy.flatten()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

头晕、心悸…你们小年轻配不上张俊杰的霸王茶姬,还要奔上市

近日,有多名网友在社交平台反映称,自己在喝了霸王茶姬的新品“万里木兰”奶茶后,出现了失眠、头晕、心悸等不同程度的不适症状,霸王茶姬方面则表示“可能是茶多酚过敏”。 而就在几天前举行的“2024年国际茶日现代东方茶创新论坛…

全局光照技术在AI去衣中的革命性角色

引言: 随着计算机视觉和深度学习技术的飞速发展,AI去衣技术已经逐渐成为图像处理和计算机图形学领域的一个热门话题。这种技术旨在通过算法模型去除或替换图像中的衣物,以服务于娱乐、电子商务、虚拟试衣等多种应用场景。而在实现高质量、真实…

getters的使用

getters的使用 如果state中的数据需要经过处理再使用,就可以利用getters函数