索引:帮助mysql高效获取数据的排好序的数据结构
mysql中索引有二叉树、红黑树、Hash表、B-Tree,但是在mysql中使用最多的是B-Tree结构存储数据而不是其他几种,原因如下:
1.对于二叉树和红黑树,查询的效率与树的高度有关,当数据量有几千W时,其树的高度就会很大不便于遍历,且红黑树插入数据时需要对树进行调整。
2.对于B+Tree来说:
a.其叶子节点不仅包含所有索引的字段,他们直接还通过指针进行连接,提高了区间访问的性能,可以实现横向遍历
b.非叶子节点不存储data,只存储索引,其通过页的方式设计,且只有三层,数据按照主键递增的方式存储,也就是节点中的数据索引从左到右递增排列,每一页的第一个数据是下一页最小也就是第一个索引,最下面一层的叶子节点存放索引和数据,当要查询时候,从根节点开始,通过折半查找的方式定位到要查找字段的范围,之后再到第二层的范围中再次使用折半查找,最后跑到第三层也就是最后一层找到数据,一共只需经历三次查找遍历,大大提高查找性能。
3.对于Hash结构来说,通过某种方法构建hash表,计算每一个关键字的hash值,然后存储到hash表中,在通过链表将这些数据连接起来。虽然hash表查找效率很高也就是说只需要计算一下关键字的值,然后直接在hash表里面查找就可以了,但是该方式只适用于查找一个数,而不适用于范围查找,而b+树各个索引直接使用指针连接,可以实现范围查找。
4.为什么要使用主键递增的方式:mysql使用的是B+树作为存储结构,如果使用主键递增的方式存储数据,每次插入数据时,只需直接在每一页的最后插入就行了,而若不使用主键递增的方式,当在某一页中间的位置插入数据时,还要设计到分页以及树的调整问题,使得效率开销变大。