mysql索引数据结构笔记

406 阅读3分钟

mysql索引是什么

索引是帮助mysql高效查找数据、排好序的数据结构
目前来说,mysql索引都是基于B+树实现的

B+树是怎么样的?以下链接是学习B+树等数据结构的网站,非常建议收藏使用(无墙)

www.cs.usfca.edu/~galles/vis…

非常直观,而且有动画,能够看到节点分裂的过程,一棵B+树的样子

但是mysql对B+树做了一些调整,mysql的B+树的叶子结点是基于循环双向链表实现的,也就是叶子节点之间会有一个指向前一个节点的指针和指向后一个节点的指针,而尾节点指向头节点,头节点也指向尾节点,形成循环双向链表。

从图片中,可以看到,B+树的叶子节点是和非叶子节点会重复,区别于B树,B树并不会重复。(B树和B+树区别可以自行百度,或者在上面链接中👆自己尝试一下)

mysql索引

myisam引擎

myisam引擎的索引属于非聚集索引(也叫非聚簇索引,或者稀疏索引),意思就是索引和数据分离,我们来看看一张基于myisam引擎的test表文件:

很清晰地看到,有3个文件,.frm文件是表结构定义文件,.MYI是存放索引文件,.MYD是存放数据的文件。一般我们根据索引查找的时候,会先在.MYI文件中找到索引,然后通过磁盘文件指针到.MYD文件中查找具体的数据,索引和数据分离,所以就叫非聚集索引。

innodb引擎

innodb引擎的索引属于聚集索引(也叫聚簇索引),意思就是索引和数据存储在一起,我们来看看一张基于innodb引擎的user表文件:

同样的,.frm文件是表结构定义文件,区别myisam,innodb只有一个.ibd文件,就是索引和数据都放一起的文件。查找时,通过索引查找,找到叶子结点,就可以直接通过指针拿到整行数据。

innodb有一个特殊的功能叫“自适应哈希索引(adaptive hash index)”,当innodb注意到索引的值陂非常频繁地使用时,它会在内存中基于B-tree索引之上再创建一个hash index,这样B-tree索引也具有了hash index的一些优点。这是一个完全自动的、内部的行为,用户无法控制或配置,不过,如果有必要,可以完全关闭该功能

关于innodb主键

1、为什么innodb要有主键

那是因为mysql设计如此,默认有主键,如果建表的适合没有创建主键,mysql会根据Rowid生成一个整型数值,作为主键

2、为啥推荐连续整型并且自增的值为主键?

因为如果是非整型的话,mysql会做转换再比对(比如uuid),如果非连续的话,插入B+树时,可能会出现大量的分裂,重整的操作,以维护B+树的结构,这将会是一个非常消耗内存的操作。

3、为什么辅助索引(非主键索引)最终要定位到主键索引,需要遍历两棵树,这不是更消耗性能吗?

原因之一:如果每一个主键都直接定位到数据,则会造成大量的冗余,如果定位到主键,则只需要维护一份完整的数据即可。

原因之二:如果出现并发写操作,如果存在多份数据,则难以保证一致性。