深入理解Mysql索引底层数据结构与算法

深入理解Mysql索引底层数据结构与算法

----->之前很多人还问我一些关于mysql索引的底层和使用,我就特意写一篇文章跟大家一起分享一下我对mysql索引的理解,大家有更深入的理解可以下面留言。

1.索引的定义
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构

大家使用索引有没有想过这个问题?为什么索引能够帮助mysql高效获取数据?我一一给大家道来!在给大家讲之前,先更大家分享一些计算机基础知识,有助于理解

  • 我们都知道mysql数据是已文件的形式存储在磁盘上的。
  • 那磁盘是有一圈一圈的磁道组成的
  • 磁头移动到不同磁道,磁盘旋转,这样就可以读取到数据
  • 磁盘存取原理 1.寻道时间(速度慢,费时) 2.旋转时间(速度较快)
  • cpu读取数据都是从内存去读,内存去磁盘读取数据,内存读取磁盘数据大小都是已页的大小单位,一页=10kb

总结:

  1. 通过上面的一些知识,我们知道当磁头移动到另一个磁道读取诗句就是我们常说的一次I/O操作,但是我们知道mysql数据是分布到不同的磁道上的,每次读取数据都要把所有磁道读取一遍,那我们进行I/O次数就很多了,查询效率就很低
  2. 那索引就是把索引字段数据的地址保存起来,来帮助mysql直接定位到哪个磁道的哪个扇区,这样就减少I/O操作了,自然查询效率就提高了
2.数据结构那么多,mysql索引为什么要用B+Tree数据结构,而不是其他呢?肯定其他的数据不满足我们的要求

常见的数据结构

1.二叉树2.红黑树3.Hash4.B Tree5.B+Tree
a.二叉树

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

不使用原因:会出现极端情况,一个节点只有一度,就是只有一个子节点,那读取树的一层就是一次I/O,那性能也不好
b.红黑树

红黑树即为平衡二叉树的一种

不使用原因:极端情况下,一个节点有2个子节点,那就出现一层只有2个节点的情况,这种性能也不好
c.Hash
不使用原因:Hash是把索引数据进行Hash算法对应一个地址,我们会发现这个好像性能很好啊,直接找到,但是我们想想,它能满足我们日常开发大部分情况吗?比如通过大于或者小于去筛选数据,所以说也不合适,当然mysql还是提供了Hash索引,毕竟有些场合还是用起来也不错
d.B Tree

1.度(Degree)-节点的数据存储个数 2.叶节点具有相同的深度 3.叶节点的指针为空 4.节点中的数据key从左到右递增排列

不使用原因:虽然解决了每一层的节点数的极端情况下,但是我们会发现每个节点存储了索引和数据,那一层能存储的数据太多也不好,毕竟内存能读取的数据大小就是10kb
e.B+Tree

1.B+Tree(B-Tree变种) 2.非叶子节点不存储data,只存储key,可以增大度 3.叶子节点不存储指针 4.顺序访问指针,提高区间访问的性能

使用原因:设计有几个方面
1.非叶子节点不存储data,只存储key,可以增大度
2.叶子节点不存储指针
3.顺序访问指针,提高区间访问的性能
3.B+Tree索引的性能分析
  • 一般使用磁盘I/O次数评价索引结构的优劣
  • 预读:磁盘一般会顺序向后读取一定长度的数据(页的整数倍)放入内存
  • 局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用
  • B+Tree节点的大小设为等于一个页,每次新建节点直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,就实现了一个节点的载入只需一次I/O
  • B+Tree的度d一般会超过100,因此h非常小(一般为3到5之间)
4.不同的存储引擎有不同的索引实现

1.MyISAM索引实现(非聚集) 2.InnoDB索引实现(聚集)

a.MyISAM索引实现(非聚集)

--->MyISAM索引文件和数据文件是分离的

b.InnoDB索引实现(聚集)

1.数据文件本身就是索引文件 2.表数据文件本身就是按B+Tree组织的一个索引结构文件 3.聚集索引-叶节点包含了完整的数据记录 4.为什么InnoDB表必须有主键,并且推荐使用整型的自增主键? 5.为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

5.联合索引结构

---->联合索引的底层存储结构长什么样?

6.索引最左前缀原理

原文地址:https://www.cnblogs.com/pingping-joe/p/11044326.html

时间: 2024-09-29 09:44:46

深入理解Mysql索引底层数据结构与算法的相关文章

【一步一步学习mysql】Mysql索引底层数据结构与算法

索引是什么 索引是帮助MySQL高效获取数据的排好序的数据结构. 索引存储在文件里 补充知识: 磁盘存取原理: * 寻道时间(速度慢,费时) * 旋转时间(速度较快) 磁盘IO读取效率: * 单次IO读取是N个页的大小,读取数据量大于N个页就需要分页读取. 索引的数据结构,推荐学习网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 二叉树 有可能出现worst-case,如果输入序列已经排序,则时间复杂度为O(N)

理解MySQL——索引与优化

转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tr

理解MySQL——索引与优化(转)

理解MySQL--索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tree索

MySQL索引底层实现

索引的本质 MySQL官方对于索引的定义为:索引是帮助MySQL高效获取数据的数据结构.即可以理解为:索引是数据结构. 我们知道,数据库查询是数据库最主要的功能之一,我们都希望查询数据的速度尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化.最基本的查询算法当然是顺序查找,当然这种时间复杂度为O(n)的算法在数据量很大时显然是糟糕的,于是有了二分查找.二叉树查找等.但是二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树,但是数据本身的组织结构不可能完全满足各种数据结构.所以,

(转)理解MySQL——索引与优化

参考资料:http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html ———————————— 全文: 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行1

理解MySQL——索引与优化(很强大)

写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记 录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4 个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要 100s(但实际上要好很多很多).如果对之建立B-Tree索引,则只需要进行log1

MySQL索引底层实现原理

优秀博文: MySQL索引背后的数据结构及算法原理 B树.B-树.B+树.B*树[转],mysql索引 MySQL 和 B 树的那些事 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化.最基本的查询算法当然是顺序查找(linear search),这种复杂度为O

MySQL索引及数据结构

Hash索引 (1) 它会使用到hash函数,算出一个确切的值 , 如果key发生变化. hash值也会跟着发生变化. 而且还存在着hash冲突的情况. (2)  联合索引的情况 hash(id+name) = hash值 , 不能支持 部分索引查询和范围查找. 红黑树 (1) 树太高,读取磁盘的次数过多, 1,2,4,8,16...... 比如第一层只会存一个数据,读一次磁盘,就取1个数据 ,如果是n叉树,读一次磁盘可以拿到n个数据.... (2) 每次读取磁盘浪费太多 所以, 不适合做数据库

MySql索引底层原理

索引在生活中最常见的概念,无论是字典,还是图书馆藏书查找,根据索引能节约我们的时间.索引是一种为了高效获取数据的数据结构.要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树. 一.二叉树(Binary Search Trees) 二叉树是每个结点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 遍历是对树的一种最基本的运算,所谓遍历二叉树,