【享学MySQL】系列:MySQL索引的数据结构,索引种类及聚簇索引和非聚簇索引

Welcome to MySQL Workbench:MySQL 索引 另外,除了基本的索引外,MySQL 还支持其他类型的索引,如唯一索引、全文索引、空间索引等。在 MySQL Workbench 中,你还可以查看索引的使用情况,以便了解哪些索引在实际查询中被频繁使用,哪些索引可能不再需要。同时,通过 “Explain” 语句和执行计划的分析,你可以了解这些索引在实际查询中的效果,并根据需要进行优化。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 阅读详情

我是少侠露飞。博客不仅是笔记,更是一种思考,一种分享。

前言

MySQL索引是MySQL关键思想,对提升SQL性能意义颇大,也是每一个后端开发者应该熟稔于心的知识。

MySQL索引本质上是一种数据结构。是MySQL组织数据一种形式,便于提高查询效率。

1 MySQL索引的数据结构

MySQL索引其实有四种:B+树索引、哈希索引、倒排索引、R树索引(这里针对InnoDB引擎)。B+树索引是最常用的数据类型,也是开发、面试中的重点考察内容,其它三种索引仅做了解。

1.1 B+Tree索引

B+树索引是本篇重点介绍的。B的意思是Balance(代表平衡,千万不要理解为是Binary),索引B+树即多路平衡搜索树,而非是二叉树!
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
在这里插入图片描述

1.2 哈希索引

InnoDB存储引擎的哈希索引是自适应的,也就是说会根据表的使用情况自动为表生成哈希索引(如观察到建立哈希索引可以带来速度的提升则建立哈希索引),并且只是在某些页建立,不能人为干预是否在一张表生成哈希索引。

1.3 倒排索引

从MySQL5.7.6版本开始支持。是搜索引擎底层数据结构。通过对内容进行分词实现快速查询。仅仅从MySQL的角度可以不去深入研究该索引,但要是专门做搜索引擎,如Lucene或者Elastic Search则必须深入理解该索引结构。

1.4 R树索引

在MySQL很少使用,仅支持geometry数据类型,有个较大的优势是范围查询,对此类型少侠表示也从来没用过。

2 MySQL索引的种类

2.1 普通索引

是最常用的索引类型,没有限制,仅为了加速查询。

2.2 唯一索引

加速查询,列值限制唯一,可以为null但null值只能出现一次。

2.3 主键索引

加速查询,列值唯一且不能为null。一般是自增数字,当然也可以是UUID但强烈不建议。

2.4 联合索引

多个列组成一个索引,专门用于组合查询,其效率大于索引合并。注意组合索引查询时需满足最左前缀匹配原则。

2.5 全文索引

基于倒排索引的数据类型,对文本的内容进行分词,进行搜索。

3 聚簇索引和非聚簇索引

3.1 聚簇索引

我们知道,对于InnoDB存储引擎来说,表中数据是按照主键顺序存放,而聚簇索引就是按照每张表的主键去构造一颗B+树,并且叶子节点中存放着的是整张表的行记录数据。
每张表只能拥有一个聚簇索引,并且MySQL的查询优化器非常倾向于采取聚簇索引,因为聚簇索引能让我们在索引的叶子节点上直接找到行数据。

3.2 非聚簇索引

非聚簇索引也称为辅助索引,叶节点不包含行的全部数据。叶节点除了包含键值以外,每个叶节点的索引行还包含了一个书签(bookmark),该书签就是相应行数据的聚集索引键,用来告诉InnoDB引擎在哪里可以找到与索引相对应的行数据。

当通过非聚簇索引查询数据时,InnoDB引擎会遍历非聚簇索引并通过叶节点的书签来获得指向聚簇索引的主键,然后再通过聚簇索引来找到一个完整的行记录。这个过程其实就叫做回表,所以回表比较慢,因为相比聚簇索引,多了一次索引查询过程。

聚簇索引和非聚簇索引的关系如下图所示:
在这里插入图片描述

3.3 聚簇索引和非聚簇索引查询时的区别

根据上面的分析,由于聚簇索引树的叶子节点直接就是我们要查询的整行数据了。而非聚簇索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询(此过程即为回表)。正因为多了一次回表的操作,所以通过非聚簇索引查询效率经常低于聚簇索引的查询效率。

但是非聚簇索引查询一定就比聚簇索引慢吗?

其实不然,MySQL还有一种技术叫做覆盖索引,没错,就是执行计划的Extra列中经常出现的一个值:covering index,它是指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。 如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from covering_index_sample where key1 = ‘keytest’;的时候,就可以通过覆盖索引查询,无需回表。

4 B+树索引的使用

4.1 什么时候适合建立索引

首先需要明确,并不是所有场景下都要为每个字段创建索引的。我的经验是:当访问表中很少一部分数据行时,使用B+树索引才有意义。

关于此点,少侠曾经做过测试,当扫描行数高于总表记录的20%时,索引就会失效,退化成全表扫描,这是MySQL优化器的选择,不是SQL书写的问题。

比如说,用户表里有个性别字段,基本上只有’M’和’F’两个选择,并且比例几乎是1:1(这里就不考虑男女比例失衡的社会问题),此时这个字段选择性很小,建立索引有何意义呢,基本上每次都是扫描半张表。而对于用户名,重复的概率很小,即具有高选择性,则很适合建立索引。

4.2 顺序读、随机读与预读取

上面提到当字段值具有高选择性、每次查询只取出表中少部分数据时才适合建立索引。但这根本的原因又是什么呢?这要从顺序读和随机读这两个概念说起…
顺序读是指顺序地读取磁盘上的块(Block)。在数据库中是指根据索引的叶结点数据就能顺序地读取所需的行数据(B+树有个特点:叶节点的数据是以链表的形式顺序关联起来的)。顺序读实际上是逻辑的顺序读,在物理磁盘上可能还是随机读。
随机读是指访问的块不是连续的,需要磁盘的磁头不断的移动。随机读一般是指访问非聚簇索引节点时不能得到完整的结果,需要根据非聚簇索引叶节点中的主键去聚簇索引里查找实际的行数据。
随机读的性能要远远低于顺序读的性能,所以当SQL语句通过某个非聚簇索引查询时,如果预估查询行数很多,达到一定的比例,MySQL优化器会选择全表的扫描方式,而不会走非聚簇索引。
当然MySQL为了提高读取的性能,InnoDB引擎引入了预读取技术(prefetch)。预读取是通过一次IO请求将多个页预读取到缓冲池中,并且预估预读取的多个页马上会被访问。

4.3 索引下推

Index Condition Pushdown(索引下推) 是MySQL 5.6引入的索引优化。
官方文档中给的例子和解释如下: 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%'和address LIKE '%Main Street%'来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

小结

MySQL索引是开发、面试中必须直面的技术点。熟练掌握还是很有必要的。

MySQL索引深度解析:聚簇索引与非聚簇索引的使用时机 在数据库中,索引是一种数据结构,用于提高数据的检索效率。通过创建索引,可以快速定位到存储在数据库表中的特定数据。聚簇索引是一种索引类型,它决定了数据在磁盘上的物理存储顺序。在MySQL中,每个表只能有一个聚簇索引。当创建聚簇索引时,数据会按照索引的顺序进行存储。非聚簇索引是一种索引类型,它不会改变数据在磁盘上的物理存储顺序。在MySQL中,每个表可以有多个非聚簇索引。本篇博客主要介绍了MySQL索引的两种类型:聚簇索引和非聚簇索引。 阅读详情

相关推荐

MySQL的聚簇索引与非聚簇索引

而如果有一个非聚簇索引在email字段上,索引存储的是email和对应的主键id,查询时需要回表操作,即通过email索引找到id,再通过id找到完整数据行。另外,本文需要讨论不同存储引擎的情况。在实际的应用场景中,高并发写入的环境下,聚簇索引的顺序插入可能导致页分裂,影响性能,而非聚簇索引的更新可能更频繁,需要维护多个索引结构,增加写操作的开销。在MySQL中,主键索引通常就是聚簇索引,如果没有显式定义主键,InnoDB会选择一个唯一非空索引代替,如果都没有,会生成隐藏的ROWID作为聚簇索引。

qq_39126115的博客 1320

MySQL系列(七)索引和视图

【代码】MySQL系列(七)索引和视图。

weixin_53850894的博客 2465

Mysql聚簇索引与非聚簇索引详解

聚簇索引:索引即数据,物理有序,主键查询和范围查询高效,但依赖自增键且更新代价高;非聚簇索引:索引与数据分离,支持多索引,适合高频非主键查询,但需回表(覆盖索引除外);核心设计思路:用自增主键作为聚簇索引,为高频查询字段创建合理的非聚簇索引,并利用覆盖索引减少回表。理解两者的差异,是优化 MySQL 查询性能的基础,需结合业务查询模式选择合适的索引策略。

2502_92141759的博客 1084

索引及其作用(可视化界面 MySQL Workbench)

唯一性索引和前面的普通索引基本相同,但有一个区别:唯一性索引的索引列的所有值都只能出现一次,即必须是唯一的。全表扫描要查找某个特定的行,必须从头开始一一查看表中的每一行,与查询条件作对比,返回满足条件的记录,当表中有很多行时,查询效率非常低。聚簇索引的索引顺序就是数据存储的物理顺序,这样能保证索引值相近的元组所存储的物理位置也相近。index_name:指定所建立的索引名称,一个表可建多个索引,每个索引名称必须是唯一的。使用索引可以提高系统的性能,加快数据检索的速度,但是使用索引要付出一定的代价。

Gin_9_20的博客 944

MySQL InnoDB 引擎的聚簇索引和非聚簇索引的区别

时,无需回表,提高查询速度。

Zero_pl的博客 1211

B+树与聚簇索引以及非聚簇索引的关系

B+树是一种多路平衡树,广泛应用于数据库和文件系统中。它的每个节点存储多个元素,并且具有严格的平衡结构,确保从根节点到每个叶子节点的路径长度相同。这种结构使得B+树能够快速定位数据,大幅减少磁盘I/O次数。非叶子节点只存储索引值:B+树的非叶子节点仅用于存储索引值,而数据存储在叶子节点。叶子节点链表:叶子节点包含指向相邻叶子的链表指针,方便范围查询。平衡性:每次插入或删除操作都保持树的平衡,使得从根到叶子的路径长度相等,确保查询性能稳定。范围查找高效。

huaqianzkh的专栏 1539

mysql添加索引

1.添加PRIMARY KEY(主键索引)mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )2.添加UNIQUE(唯一索引)mysql>ALTER TABLE `table_name` ADD UNIQUE (`column`)3.添加INDEX(普通索引)mysql>ALTE...

weixin_34252686的博客 311

Mysql 聚簇索引和非聚簇索引的区别

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。 在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。 https://blog.youkuaiyun.com/alexdamiao/article/details/51934917 聚簇索引:将数据存储与索引放到了一块,索引结.

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 6403

MySQL索引详解

mysql 数据库 mysql索引详解 mysql索引底层数据结构 主键索引 覆盖索引 辅助索引 联合索引 mysql B+树 索引下推 索引分类

SO_zxn的博客 1499

XTDrone平台FAST-LIO2与ego-planner结合路径规划部署

之前做了XTDrone平台FAST-LIO2的部署现在将其结合ego-planner进行导航规划,之前查看教程是使用视觉进行定位导航的,现在重新学习。修改advanced_param_xtdrone.xml,这里有视觉信息,不修改会报错显示为输入视觉话题信息。怎么描述 ,感觉当时觉得很难的问题突然就给解决了,一顿复杂,最近勤更新吧,继续开始学习。还有一个想法就是两个rviz结合在一起启动,写了一个demo,融合的不太好感觉额。改为只使用雷达点云,这里仿真的话题是/scan。

m0_56093217的博客 1083

5分钟搞定微服务架构图:手把手教你用Draw.io画出专业级设计

本文详细介绍了如何使用Draw.io快速绘制专业级微服务架构图。通过5分钟入门教程,掌握核心组件拖拽、连接线优化等技巧,提升系统设计可视化效率。特别适合需要快速呈现分布式系统架构的开发团队,利用内置微服务元素和分层展示功能,轻松创建清晰易懂的技术文档。

pz890123的博客 1238

MySQL聚簇索引和非聚簇索引的理解

关于聚簇索引和非聚簇索引的概念很多同学找了很多教程但是仍然很迷糊。 这里给出一篇翻译,并给出我的配图,希望对大家理解有帮助。 英文原文:http://www.mysqltutorial.org/mysql-index/mysql-clustered-index/ 一、聚簇索引的概念 一般来说索引就是如B-树这类可以来存储键值方便快速查找的数据结构。 聚簇索引是物理索引,数据表就是按...

悟鸣的技术博客 2万+

【科研学习】Demo3D2015安装包以及图文安装步骤

安装包 点击下图的.exe文件,安装 不需要解压,打开注册机 如下图: 点击上图的.exe文件,出现下图 先点击 patch 打开安装目录下的Demo3D.licensing.dll文件,然后点击Generate,生成dvt-license文件,保存即可 打开安装完成的Demo3D 2015(64-bit),一般破解没完成的,会出现一个request a license 的问题,点击find license 的那一行 点击后找到自己Generate,生成dvt

KaelCui的博客 1万+

聚簇索引和非聚簇索引

参考博客:http://www.admin10000.com/document/5372.html 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体细节依赖于其实现方式。 MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustere...

lm1060891265的博客 1万+

智能汽车竞赛摄像头处理(4)——摄像头循迹思路讲解

智能汽车竞赛摄像头处理(4)对摄像头循迹思路进行讲解。

weixin_62261692的博客 7058

【LaTeX PPT模板集】Beamer主题与配色使用教程

【LaTeX PPT模板集】Beamer主题与配色使用教程

Xminyang的博客 1万+

聚簇索引和非聚簇索引到底有什么区别?

在 MySQL 默认引擎 InnoDB 中,索引大致可分为两类:聚簇索引和非聚簇索引,它们的区别也是常见的面试题,所以我们今天就来盘它们。聚簇索引聚簇索引(Clustered Index)一般指的是主键索引(如果存在主键索引的话),聚簇索引也被称之为聚集索引。聚簇索引在 InnoDB 中是使用 B+ 树实现的,比如我们创建一张 student 表,它的构建 SQL 如下: drop table if exists student; create table student( id int prima

Free雅轩的博客 1万+

BMP280气压传感器原理图设计,已量产(压力传感器)

做嵌入式项目时,“小而精” 的传感器模块永远是刚需 —— 尤其是需要同时测气压和温度的场景,比如无人机定高、环境监测节点、穿戴设备等。最近捣鼓了一款 BMP280 的 Breakout 板,封装做得很紧凑,同时兼顾了稳定性和兼容性,这里单聊硬件设计细节。

不脱发的程序猿 300

MySQL索引:聚簇索引和非聚簇索引的区别

目录 1.聚簇索引和非聚簇索引的概念 2.两者详细介绍 3. 两者的区别 3.1 数据存储方式 3.2二级索引查询 1.聚簇索引和非聚簇索引的概念 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引两种。“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储。我们熟悉的InnoDB和MyISAM两大引擎,InnoDB的默认数据结构是聚簇索引,而MyISAM是非聚簇索引。 聚簇索引(Clustered Index)并不是一种单独的索引类型,而是一种数据存储方式。当表有了聚簇..

baidu_15952103的博客 2万+

5、癌症数据预处理技术与深度学习在癌症预测中的应用

本文详细介绍了癌症数据预处理技术和深度学习在癌症预测中的应用。针对CT扫描图像、X射线图像、超声图像、基因表达数据和文本数据等不同类型的癌症数据,分别阐述了去噪、插值、配准、归一化等预处理技术的具体方法。同时,分析了深度学习在乳腺癌、白血病和宫颈癌预测中的作用,结合相关影响因素探讨了模型的应用潜力。此外,还总结了深度学习在癌症预测中面临的挑战及未来发展方向,为癌症的早期诊断与精准预测提供了理论支持和技术参考。

alice7model的博客 123

STM32 W5500 Freemodbus Modbus TCP协议功能实现

STM32F103VCT6 W5500(SPI1),实现Modbus-TCP协议的功能

坚韧与专注 2万+

聚簇索引 和 非聚簇索引详解

聚簇索引、非聚簇索引、InnoDB

weixin_44991038的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

聚簇索引、非聚簇索引、覆盖索引

本篇将带你搞懂什么是聚簇索引、非聚簇索引、覆盖索引,并且通过画图的方式了解索引查找的过程,明白什么是回表查询索引()是数据库中一种用于快速查找和访问表中数据的结构,它类似于书的目录,通过索引可以快速定位到目标数据,而无需遍历整个表,索引的存在可以显著提高查询速度,尤其是在处理大量数据时MySQL中默认使用索引的数据结构是。

Gaomengsuanjia_的博客 1375

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL - 聚簇索引和非聚簇索引

聚簇索引和非聚簇索引B+Tree的叶子节点存放主键索引值和行记录就属于聚簇索引;如果索引值和行记录分开存放就属于非聚簇索引。主键索引和辅助索引B+Tree的叶子节点存放的是主键字段值就属于主键索引;如果存放的是非主键值就属于辅助索引(二级索引)。在InnoDB引擎中,主键索引采用的就是聚簇索引结构存储。...

迪曼奥特迦-博客 3854

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 【搞定面试官】系列:如何保证缓存与数据库的双写一致性
下一篇: 【享学MySQL】系列:MySQL中的锁机制
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值