Mysql索引总结

本文笔记是在学习图灵学院公开课的视频链接后的总结:
https://www.bilibili.com/video/BV1BJ411i71F?p=21
数据结构的模拟网站链接:
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

Mysql索引总结

索引是帮助mysql快速获取排好序的数据结构。
索引数据结构?
二叉树:右边的节点大于父节点,左边的节点小于父节点。二叉树会出现单边增长但是不会自动平衡。
Mysql索引总结
红黑数:二叉平衡树,出现单边增长后,会自动平衡与裂变。
红黑树作为索引的数据结构的弊端?
答:数据量多的时候,会使得树的高度很高,这样根据索引查找效率过慢。
Mysql索引总结
Mysql索引数据结构为B+Tree。Hash表存储索引的效率也很高,为什么不用呢?
答:hash表存储索引不适用于范围查找,如>6是不起作用的。而B+tree的叶子节点中有一个指针,指向下一个叶子节点可以快速的实现范围查找。
Mysql索引总结
B+tree每一根节点可以存放索引的大小为16KB,一个根节点
MyISAM存储引擎,(非聚集索引)。.myi(索引文件),.myd(数据文件),也就是索引文件和数据文件是两个不同的文件。查询较慢,如下图:叶子节点存储的是指向数据的磁盘指针。
Mysql索引总结
InnoDB存储引擎(聚集索引)。.ibd文件,叶子节点存储的是索引和数据,如下图:
Mysql索引总结
聚集索引:叶节点包含了完整的数据记录。
总结:存储引擎是小到表级别,大到数据库,一般来说是形容表的。

1.为什么InnoDB必须要有主键?并且一般建议为整型的自增主键?

答:因为必须要有主键索引来组织数据元素,(这是索引的特性),如果我们使用innoDB的时候,没有创建主键,mysql会在底层会默认的先从我们创建的表里面找出一个字段作为索引,如果没有找出来,会在底层帮我们创建出来一个类似于rowid的索引。

2.有很多公司使用UUId作为主键?为什么一般建议为整型的自增主键??

答:UUId长度较长,比我们int类型浪费了更多的存储资源。
Uuid是随机字段串,我们底层在利用B+树来存储,需要比较大小时,字符串比较会很慢。而且会引起列变和平衡。因为自增的索引不会引起B+Tree的裂变和平衡。

3.为什么非主键索引结构叶子节点存储的是主键值?

答:a. 保持一致性:
当数据库表进行DML操作时,同一行记录的页地址会发生改变,因非主键索引保存的是主键的值,无需进行更改。
b. 节省存储空间:
Innodb数据本身就已经汇聚到主键索引所在的B+树上了, 如果普通索引还继续再保存一份数据,就会导致有多少索引就要存多少份数据。

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

col1表示的是年龄,col2表示的是姓氏,col3表示的是名字。
非叶子节点是按照年龄排序的,叶子点根据年龄排序之后再根据姓氏和名字排序;解释了最左原则。
BigInt在mysql是8byte大小,