微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/wenti/3282267.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐