深入讲解MySQL Innodb索引的原理

MySQL5.7 InnoDB 磁盘结构之索引Index 当分配兄弟页时,对先前固定的叶页的引用将被释放,新分配的叶页将成为最右侧的叶页和新的默认插入位置。不是单独刷新每个单词,而是将同一单词的插入合并并作为单个条目刷新到磁盘,从而提高插入效率,同时保持辅助索引表尽可能小。直接查询辅助索引表中的数据,并将辅助索引表的结果与全文索引缓存的结果合并后返回。每个辅助索引表通过辅助索引表名称中与索引表的匹配的十六进制值与索引表关联。如果表很大,则与使用与索引记录不同的页存储行数据的存储组织相比,聚集索引架构通常可以节省磁盘 I/O 操作。通常,聚集索引与主键同义。 阅读详情

转自:https://www.jb51.net/article/150365.htm

索引的科普

先引进聚簇索引和非聚簇索引的概念!

我们平时在使用的Mysql中,使用下述语句

?

1

2

3

4

5

6

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

 [USING index_type]

 ON tbl_name (index_col_name,...)

  

index_col_name:

 col_name [(length)] [ASC | DESC]

创建的索引,如复合索引、前缀索引、唯一索引,都是属于非聚簇索引,在有的书籍中,又将其称为辅助索引(secondary index)。在后文中,我们称其为非聚簇索引,其数据结构为B+树。

那么,这个聚簇索引,在Mysql中是没有语句来另外生成的。在Innodb中,Mysql中的数据是按照主键的顺序来存放的。那么聚簇索引就是按照每张表的主键来构造一颗B+树,叶子节点存放的就是整张表的行数据。由于表里的数据只能按照一颗B+树排序,因此一张表只能有一个聚簇索引。

在Innodb中,聚簇索引默认就是主键索引。

这个时候,机智的读者,应该要问我

如果我的表没建主键呢?

回答是,如果没有主键,则按照下列规则来建聚簇索引

没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

ps:大家还记得,自增主键和uuid作为主键的区别么?由于主键使用了聚簇索引,如果主键是自增id,,那么对应的数据一定也是相邻地存放在磁盘上的,写入性能比较高。如果是uuid的形式,频繁的插入会使innodb频繁地移动磁盘块,写入性能就比较低了。

索引原理介绍

先来一张带主键的表,如下所示,pId是主键

 

pIdnamebirthday
5zhangsan2016-10-02
8lisi2015-10-04
11wangwu2016-09-02
13zhaoliu2015-10-07

 

画出该表的结构图如下

如上图所示,分为上下两个部分,上半部分是由主键形成的B+树,下半部分就是磁盘上真实的数据!那么,当我们, 执行下面的语句

?

1

select * from table where pId='11'

那么,执行过程如下

如上图所示,从根开始,经过3次查找,就可以找到真实数据。如果不使用索引,那就要在磁盘上,进行逐行扫描,直到找到数据位置。显然,使用索引速度会快。但是在写入数据的时候,需要维护这颗B+树的结构,因此写入性能会下降!

OK,接下来引入非聚簇索引!我们执行下面的语句

?

1

create index index_name on table(name);

此时结构图如下所示

大家注意看,会根据你的索引字段生成一颗新的B+树。因此, 我们每加一个索引,就会增加表的体积, 占用磁盘存储空间。然而,注意看叶子节点,非聚簇索引的叶子节点并不是真实数据,它的叶子节点依然是索引节点,存放的是该索引字段的值以及对应的主键索引(聚簇索引)。

如果我们执行下列语句

?

1

select * from table where name='lisi'

此时结构图如下所示

通过上图红线可以看出,先从非聚簇索引树开始查找,然后找到聚簇索引后。根据聚簇索引,在聚簇索引的B+树上,找到完整的数据!

那

什么情况不去聚簇索引树上查询呢?

还记得我们的非聚簇索引树上存着该索引字段的值么。如果,此时我们执行下面的语句

?

1

select name from table where name='lisi'

此时结构图如下

如上图红线所示,如果在非聚簇索引树上找到了想要的值,就不会去聚簇索引树上查询。还记得,博主在《select的正确姿势》提到的索引问题么:

当执行select col from table where col = ?,col上有索引的时候,效率比执行select * from table where col = ? 速度快好几倍!

看完上面的图,你应该对这句话有更深层的理解了。

那么这个时候,我们执行了下述语句,又会发生什么呢?

?

1

create index index_birthday on table(birthday);

此时结构图如下

看到了么,多加一个索引,就会多生成一颗非聚簇索引树。因此,很多文章才说,索引不能乱加。因为,有几个索引,就有几颗非聚簇索引树!你在做插入操作的时候,需要同时维护这几颗树的变化!因此,如果索引太多,插入性能就会下降!

MySQL索引底层数据结构及原理深入分析 为什么加索引就查的快了?索引到底是什么? 阅读详情

相关推荐

理解MySQL索引的底层实现原理

理解索引的特性 、索引的本质 、其他结构的问题 、B-Tree 和 B+Tree 、MySQL索引实现

ZY-JIMMY 3620

MySQL 索引原理

MySQL索引深入剖析

杨宇昌的博客 1万+

Ubuntu下OpenOCD+GDB的安装、编译及使用

目标开发板(芯片):stm32mp157aaa 仿真器:ST-Link 操作系统:Ubuntu 18.04 调试软件:OpenOCD OpenOCD的安装 首先下载OpenOCD有多种方式,可以GitHub上下载,目录下打开终端,输入 git clone git://git.code.sf.net/p/openocd/code openocd 下载完整的OpenOCD的文件夹。进入到OpenOCD的目录下,开始安装。 接着,OpenOCD适用于微处理器的debug和烧写,需要下载相关库 sud

蓝冰露的博客 9525

mysql 实施索引_MySQL 索引实现

数据结构Mysql 使用 B+树为什么选择 B+ 树,而非二叉树,红黑树,B- 树呢?二叉树:对于表提供自增整形字段作为建立索引的列,那子元素总是添加去了右侧,导致左子树一直为空,那么查找时就完全退化成了没加索引那样了。红黑树:红黑树解决了二叉树不平衡的问题。然为什么要费力保持树的平衡性?是因为树的查找性能取决于树的高度,让树尽可能平衡,就能降低树高。但因为其父节点只能存在两个子节点,那在数据量大...

weixin_34234884的博客 359

蓝牙Channel Sounding为真正的距离感知赋能

1:工作原理蓝牙™信道探测使用两种经过验证的测距方法——PBR(PBR)和RTT(RTT),实现蓝牙设备之间的安全精密测距。

weixin_43720159的博客 807

Claude Code 分布式并行开发最佳实践:1中枢+10Worker跨多Git仓库全流程落地

本文介绍了一套基于Claude Code和Git Worktree的分布式并行开发方案,解决多仓库、微服务开发中的核心痛点。方案采用"1个决策中枢+10个并行Worker"架构,中枢负责任务拆解和调度,每个Worker绑定独立仓库实现完全隔离开发。关键优势包括:任务并行效率提升10倍、跨仓库依赖自动编排、版本统一管理、零第三方依赖。文章详细提供了环境准备、架构设计、中枢搭建和初始化脚本等全流程落地指南,特别适合多仓库协同的全栈开发场景。

AI天才研究院 244

MySQL 索引原理详解

InnoDB中的B+Tree,Mysql索引

记录,交流,共同进步 3008

uni-app - 解决 H5 微信公众号授权登录后,无法回退到 “上一页“ 的问题(微信登录后如何返回到触发它的那一页?无法通过 uni.navigateBack() 返回到前一页的问题?)详细教程

uniappH5微信登录重定向后无法返回到原来进入前的页面了,uni-appH5微信浏览器中授权微信登录后,无法正常回退问题,uniappH5微信登录后怎么返回上一页,uniapp公众号登陆后使用uni.navigateBack()回不去上一页,uniapp微信登录成功后返回页面后一直自动刷新页面,uniapph5授权成功后如何返回上一页,uniappH5微信登录后怎么返回到触发它的那一页去,公众号h5在授权后如何跳转回到刚进入时的页面,微信公众号H5网页返回上一页疑问,解决微信H5静默授

🏆 前端领域优质创作者 7715

一文搞懂MySQL索引(实现原理加优化实战,面试必问)

本文对MySQL索引从构建原理,到各类索引实现,性能调优,优缺点进行全方面讲解,希望对读者了解索引有个清晰的认识。

java_beautiful的博客 729

CesiumForUnreal实现地形等高线效果

CesiumForUnreal实现地形等高线效果

专注GIS开发 3437

点云语义分割:RandLANet模型推理C++部署(2)

一、数据读取及预处理 二、模型推理 三、结果保存

zhaoguanhua的博客 3799

mysql索引的实现原理

1,mysql索引原理: hash:通过索引的计算定位到数据的存储的位置,进行一次I/O即可,效率非常高,但是是适合用于等值查询,范围查询索引是不起作用。 B+bree:MySQL的b+tree不是b-tree,而是在b-tree上进行了优化,所有的data都放在了叶节点,目的是为了使根节点存储更多的索引key值,mysql默认每一节点层是存储16k的数据,假设:存储的主键索引...

weixin_42533856的博客 2237

模拟一个基站和一个移动台之间的信号传播

同样使用时间序列和上述参数计算出反射径信号的信号强度。根据时间序列和上述参数,计算出直射径信号的信号强度。该信号被视为一个简单的正弦波信号,其频率是2Hz。:时间序列,从0.1秒开始,每隔0.0001秒采样一次,直到12秒。:设置坐标轴范围,横轴范围为0到12秒,纵轴范围为-0.5到0.5。:移动台移动的速度。:移动台距离基站的初始距离。:基站到反射墙的距离。假设基站到反射墙的距离为15米。:绘制直射径信号、反射径信号和合成信号的波形图。:添加标签,标注每条曲线对应的含义。表示反射径信号的颜色为绿色,

Fanjufei的博客 291

MYSQL索引底层原理

MYSQL索引底层原理

winy1986的博客 3863

OpenClaw实战系列10(完结篇):企业级应用实战案例——从0到1搭建智能客服系统

本文以一家跨境电商公司为例,从需求分析、系统设计、分步搭建到上线运营,完整呈现智能客服系统的落地全过程。所有配置命令和截图均来自实测环境,你可以直接复制使用。

PeterPan的博客 1306

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MySQL的InnoDB引擎下索引那些事简单总结(一):索引原理

一、没有索引会怎样 在没有索引的情况下,查询一个数据页中的记录的方法参考 https://blog.youkuaiyun.com/GOODNESS_/article/details/88709915 中的简单介绍。 如果没有索引,当我们查询时: 首选需要判断要查找的数据在哪一个数据页,这就需要从头开始遍历所有的数据页,直到确定所在的数据页。 查找到对应的数据页后是否是主键查询还分两种情况: 主键查询:根据...

GOODNESS_的博客 371

NTscan扫描工具

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

MySQL(Innodb)索引的原理

引言 回想四年前,我在学习mysql的索引这块的时候,老师在讲索引的时候,是像下面这么说的 索引就像一本书的目录。而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点。这样就帮助用户有效地提高了查找速度。所以,使用索引可以有效地提高数据库系统的整体性能。 嗯,这么说其实也对。但是呢,大家看完这种说法,其实可能还是觉得太抽象了!因此呢,我还想再深入的细说一下,所以就有...

u010600950的博客 163

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

辅助索引会触发锁吗_InnoDB事务及索引原理

1. 前言MySQL涉及到的知识多且深,这里主要捡两个最基础也是后端RD最常接触到的点来展开:InnoDB的事务及索引原理,偏理论,面试中被问到的概率非常大。为了更好的说明原理,贴了很多图,大多来源于网络,侵删。2. InnoDB存储引擎2.1 MySQL分层架构分层架构接入层:主要负责连接处理、授权认证、安全等事宜。服务层:查询解析、分析、优化、缓存及所有内置函数,所有跨存储引擎的功能都在这一层...

weixin_39824801的博客 165

MySQL索引底层实现原理 & MyISAM非聚簇索引 vs. InnoDB聚簇索引

MySQL索引底层实现原理 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n...

AI天才研究院 9367

MySQL索引原理及B-Tree / B+Tree结构详解

MySQL索引原理及B-Tree / B+Tree结构详解 目录 摘要 数据结构及算法基础 索引的本质 B-Tree和B+Tree B-Tree B+Tree 带有顺序访问指针的B+Tree 为什么使用B-Tree(B+Tree) 主存存取原理 磁盘存取原理 局部性原理与磁盘预读 B-/+Tree索引的性能分析 MySQL索引实现 MyISAM索引实现 Inno...

最怕一生碌碌无为,还安慰自己平凡可贵 2万+

MySQL5:MySQL数据存储文件;MylSAM中索引和数据是两个独立的文件,它是如何通过索引找到数据呢?聚集索引/聚簇索引,InnoDB中二级索引为什么不存地址而是存键值?row ID如何理解?

MylSAM中索引和数据是两个独立的文件,它是如何通过索引找到数据呢? MylSAM的B+Tree里面,叶子节点存储的是数据文件对应的磁盘地址。所以从索引文件.MYI中找到键值后,会到数据文件.MYD中获取相应的数据记录。 在MylSAM里面,其他的索引也在这个.MYI文件里面。  非主键索引跟主键索引存储和检索数据的方式是没有任何区别的,没有主次之分,二者都是在索引文件里面找到磁盘地址,然后到数据文件里面获取数据。

郝开的博客 930

MySQL索引原理以及慢查询优化

转自:http://benjaminwhx.com/2018/02/26/MySQL%E7%B4%A2%E5%BC%95%E5%8E%9F%E7%90%86%E4%BB%A5%E5%8F%8A%E6%85%A2%E6%9F%A5%E8%AF%A2%E4%BC%98%E5%8C%96/ 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存...

神韵 901

CodingLabs - MySQL索引背后的数据结构及算法原理

CodingLabs - MySQL索引背后的数据结构及算法原理 原文:CodingLabs - MySQL索引背后的数据结构及算法原理 首页 | 标签 ...

weixin_30408675的博客 2082

MySQL索引原理及实战

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。 第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引

sinat_36171659的博客 266

MySQL InnoDB索引

MySQL InnoDB 索引

m0_72608856的博客 225

mysql数据库索引 MyISAM 索引与InnoDB 索引

mysql基础操作,与一般的sql数据库一样,是增删查改 简单的学习菜鸟:https://www.runoob.com/mysql/mysql-tutorial.html 什么是索引 在关系型数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单 简单理解就是重新建一个目录,到时候查这目录’然后再返回去找原先那个数据表。可以快速增加查询速度,但会减慢增删改操作。 https..

歌布衣的博客 274
上一篇: io多路复用
下一篇: mysql myisam和innodb的存储
wiscourper_
博客等级 码龄17年 1641粉丝 272原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值