MySQL索引

定义

索引(Index)是帮助MysqL高效获取数据的数据结构。

所以本质上说:索引是数据结构。

在实际中,数据数据本身的组织结构不可能完全满足各种数据结构(例如,二分查找的数据必须有序,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

为什么采取B-树或B+树

索引文件本身也很大,不可能存储在内存中,所以索引往往以索引文件的形式存储的磁盘上。
这样读取数据的时候肯定会有访问磁盘的操作,磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动
这两部分的运动相对于内存读取来讲是非常慢的。所以采取了B树来进行优化。
采取多阶B树
可以构造一个多阶B树,让高度降低,减少磁盘读取次数

所以什么形式的数据结构可以减少查找过程中磁盘I/O的存取次数,索引采取什么形式的数据结构。

MysqL两种存储引擎

MyISAM索引实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0ixA8Cb-1661332742075)(https://cdn.jsdelivr.net/gh/LiWei800999/tutu@main/202208241717088.png)]

MyISAM引擎使用B+Tree作为索引结构

MyISAM索引文件仅保存数据的地址,除主索引要求key是唯一的,辅助索引的key可以重复的以外,其主索引和辅助索引在结构上是没有区别的。

InnoDB索引实现

InnoDB表数据文件本身就是主索引,以数据库的表的主键为key搭建B+树(索引InnoDB要求表必须有主键,MyISAM可以没有),叶子节点存储的是数据而不是地址。
InnoDB的辅助索引data域存储的数据是主键的KEY值,也就是说,辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

所以不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大

而且用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

因为磁盘存取与内存存取相比很慢,所以实际中,磁盘读取并不是按需读取的,磁盘会预读,预读的长度一般为页(page)的整倍数,一般4k为一页

按照b树定义,一次访问最多需要访问h个节点,但是因为有上面的预读机制,数据库设计者把一个节点的大小设为一页。每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里。这样一个节点只需要一次I/O就可以查到

参考:http://blog.codinglabs.org/articles/theory-of-MysqL-index.html

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...
win11本地账户怎么改名?win11很多操作都变了样,用户如果想要...