MySQL索引底层数据结构详情
作者:bkpp976 发布时间:2024-01-23 09:47:53
目录
一、索引类型
1.B+树
2.MyISAM和InnoDB的B+树索引实现方式的区别(聚簇索引和非聚簇索引)?
3.非聚簇索引
4.聚簇索引的优缺点
5.哈希索引
6.自适应哈希索引
一、索引类型
1.B+树
为什么是B+树而不是B树?
首先看看B树和B+树在结构上的区别
B树结构:
B+树:
可以看到:
B树在每个节点上都有卫星数据(数据表中的一行数据),而B+树只在叶子节点上有卫星数据。这意味着相同大小的磁盘扇区,B+树可以存储的叶子节点更多,磁盘IO次数更少;同样也意味着B+树的查找效率更稳定,而B树数据查询的最快时间复杂度是O(1)。
B树的每个节点只出现一次,B+树的所有节点都会出现在叶子节点中。B+树的所有叶子节点形成一个升序链表,适合区间范围查找,而B树则不适合。
2.MyISAM和InnoDB的B+树索引实现方式的区别(聚簇索引和非聚簇索引)?
首先需要了解聚簇索引和非聚簇索引。
聚簇索引:
在聚簇索引中,叶子页包含了行的全部数据,节点页值包含索引列。InnoDB通过主键聚集数据,如果没有定义主键则选择一个唯一的非空索引列代替;如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。
聚簇索引的数据分布:
在聚簇索引中,除了主键索引,还有二级索引。二级索引中的叶子节点存储的不是“行指针”,而是主键值,并以此作为指向行的“指针”。这意味着通过二级索引查找行,存储引擎需要找到二级索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中查找对应的行,也称为“回表”。当然,可以通过覆盖索引避免回表或者InnoDB
的自适应索引能够减少这样的重复工作。
注意:聚簇索引中每一个叶子节点不止包含完整的数据行,还包括事务ID、用于事务和MVCC的回滚指针。
3.非聚簇索引
非聚簇索引的主键索引和二级索引在结构上没有什么不同,都在叶子节点上存储指向数据的物理地址的“行指针”。
聚簇索引的主键索引和二级索引:
非聚簇索引的主键索引和二级索引:
4.聚簇索引的优缺点
优点:
把相关数据保存在一起(比如用用户ID把用户的全部邮件聚集在一起),否则每次数据读取就可能导致一次磁盘IO
数据访问更快,把索引和数据保存在同一个B+树中,通常在聚簇索引中获取数据比在非聚簇索引中查找更快
使用覆盖查询可以直接利用页节点中的主键值
缺点:
如果所有数据都可以放在内存中,顺序访问不再那么必要,聚簇索引没有优势
插入速度依赖于插入顺序,随机插入会导致页分裂,造成空洞,使用OPTIMIZE TABLE重建表
每次插入、更新、删除都需要维护索引的变化,代价很高
二级索引可能比想象中大,因为在节点中包含了引用行的主键列
5.哈希索引
哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效,这意味着,哈希索引适用于等值查询。
具体实现:对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
在MySQL中,只有Memory
引擎显式支持哈希索引,当然Memory
引擎也支持B树索引。
注意:Memory引擎支持非唯一哈希索引,解决冲突的方式是以链表的形式存放多个哈希值相同的记录指针。
6.自适应哈希索引
InnoDB
注意到某些索引值被使用得非常频繁时,会在内存中基于B+树索引之上再创建一个哈希索引,这样就让B+树索引也具有哈希索引的一些优点,比如快速的哈希查找。
来源:https://juejin.cn/post/7037403074008203278
猜你喜欢
- 在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854;
- ?? 写在前面现在已经有很多项目团队使用Vue3+TS进行开发,同时也就意味着Vue3的生态越来越完善,如果还是停留在Vue2的阶段已经ou
- 本文为大家分享了mysql 8.0安装配置方法,供大家参考,具体内容如下直接使用apt install mysql-server安装,那么恭
- Airtest全称AirtestProject,是由网易游戏推出的一款自动化测试框架,在软件测试的时候使用到了该框架。这里记录一下安装、使用
- permute(dims)将tensor的维度换位。参数:参数是一系列的整数,代表原来张量的维度。比如三维就有0,1,2这些dimensio
- ASP中判断字符串中是否包含字母和数字的两个函数function isnaw(str) for
- 一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存。如果是个巨大的文件,则可能内存会爆掉;且,有
- 本文实例讲述了JS模拟简易滚动条效果的方法。分享给大家供大家参考,具体如下:使用Js模拟滚动条。简易模式,类似手机上常见的滚动条。效果如下:
- 以前在一个图书类网站看到这样一个功能:客户可以按条件搜索书目的信息,服务器会将符合条件的信息筛选出来保存为一个Excel文件供客户下载。今天
- CACHE_BACKEND参数每个缓存后端都可能使用参数。 它们在CACHE_BACKEND设置中以查询字符串形式给出。 有效参数如下:&n
- 1.点算子点算子是两个像素灰度值间的映射关系,属于像素的逐点运算,相邻像素不参与运算。点算子是最简单的图像处理手段,如:亮度调整、对比度调整
- 相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比如自动验证、自动完成等,今天在开发中遇到自动完成中需要获取
- str.join即sequence – 要连接的元素序列。返回通过指定字符连接序列中元素后生成的新字符串。n =
- 简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把foo()函数声明成
- 纯粹的截取字符串其实比较简单,用一个Left就搞定,但一个是全英文标题,一个是全中文标题,或中文混合排在一起,长短不一就很明显了,要考虑到中
- Xception是继Inception后提出的对Inception v3的另一种改进,学一学总是好的什么是Xception模型Xceptio
- 为大家提供了两种有效PyCharm激活方法,第一种PyCharm激活方法是直接输入激活码,一般PyCharm激活使用的人多了会被官方封,所以
- 本文实例总结了Python常见的pandas用法。分享给大家供大家参考,具体如下:import numpy as npimport pand
- 今天运行程序时,在Oracle中输入SQL语句:select * from USERS as u ,程序报错输入select * from
- 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过