1.索引是什么
索引是帮助MySQL高效获取数据的排好序的数据结构。
计算机读取磁盘数据时,磁头读取文件需经过两个步骤:
- 寻道时间(花费时间长)
- 旋转时间(花费时间少)
索引可以减少读取磁盘的数据次数,从而快速读取数据。
索引存储在文件里索引为什么要用b+tree
1.二叉树的数据结构
存在极端情况,插入值按大小顺序差是,深度过深,需要进行多次I/O。当二叉树的值过多时如下图的情形发生时,深度过深。如查询值为8时,需要查询6次,故二叉树作为数据库的底层数据结构,存在局限性。
2.红黑数的数据结构
相比二叉树,红黑树在一些情况做自动平衡优化。存在极端情况,当数据量大时,如到达上百万时,深度也会很深,需要进行多次I/O。当二叉树的值过多时如下图的情形发生时,深度过深。如查询值为8时,需要查询6次,故二叉树作为数据库的底层数据结构,存在局限性。
3.hash的数据结构
使用hash的数据结构可以快速的读取到一条数据,但是不适用于范围查询。当范围查询较少时,可以使用hash作为索引方法。
实际运用hash作为索引方法的情况较少。
4.btree的数据结构
btree与红黑树相比,btree的可以增长节点的宽度,使其寻找数据时I/O减少。如下图当btree的度为3,当一个节点的内的数据size为3时,btree就会自动优化。
因为磁盘和内存之间的I/O的数据量是有限制的(页的整数倍,一页为16kb),所以btree节点内的度不是没有上限的。
5.b+tree的数据结构
mysql的数结构一般为b+tree,b+tree为btree的变种
•非叶子节点不存储data,只存储key,可以增大度
•叶子节点不存储指针
•顺序访问指针,提高区间访问的性能
B+Tree索引的性能分析
- 一般使用磁盘I/O次数评价索引结构的优劣
- 预读:磁盘一般会顺序向后读取一定长度的数据(页的整数倍)放入内存
- 局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用
- B+Tree节点的大小设为等于一个页,每次新建节点直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,就实现了一个节点的载入只需一次I/O
- B+Tree的度d一般会超过100,因此h非常小(一般为3到5之间)