问题:Mysql索引为什么用b+树作为数据结构?
mysql如何衡量查询效率?
答:磁盘IO次数。mysql查询时,从磁盘读取数据的顺序为:先寻道,然后转到查找的磁道上,再进行读,读的时候是以页为单位,一页的大小为4k。
由此可见:一次IO的时间为:寻道+转+读。提高查询效率需减少IO次数,若是读的数据尽可能在一页上,则查询效率大大提高了。怎样实现数据尽可能在一页上呢?一、一页包含尽可能多的索引,eg:b树的非叶子节点也包含了数据,假设200个索引和200条数据分别均为2k,则对于b树来说,一页只能包含200个索引。而对于B+树来说能包含300个索引,叶子节点有100条数据。明显B+树查询效率更高。
1、为什么不用线性表?
当查找的数据正好在线性表的最后一个索引时,则会进行全表扫描
2、为什么不用二分查找?
二分查找本身有排序,排序无论用什么算法都会消耗资源,尤其是查找时可能还会有insert、update、delete,这可能会导致数据的索引发生变化,极端情况查询开销也非常大
3、为什么不用二叉数查找?
二叉树:极端情况单分支变成线性表,查询开销也非常大。eg:右侧分支有几十万甚至上百万条数据,最坏的情况是数据在右侧分支的最后一个节点,此时查询效率和线性表无二。
4、为什么不是红黑树查找?
插入数据后:数据结构发生变化
再插入多个数据后,数据结构发生变化,树的深度越来越深,极端情况下,一次IO能读的数很有限。
5、为什么不是哈希查找?
哈希算法虽然高,但也有它的局限性
1、 哈希索引只能操作:in、=,不支持范围查询,eg:>,
原因:哈希索引比较的是经过哈希算法之后的哈希值,而哈希索引是无序的,用范围值的结果计算出来的哈希值并不一定和哈希索引中的排序是一样的。还有可能发生哈希碰撞。
2、 由于哈希索引本身是不排序的,所以任何时候都避免不了索引全表扫描。
6、为什么不是B树查找?
B树的优点:一个节点可以保存多个索引,通过度解决了红黑树的树深问题
缺点:由于非叶子节点也保存数据,导致一次IO读不到更多的索引
什么是度?度可简单劣
7、为什么是B+树查找?
优点:B+树比B树更优的地方在于,B+树的数据均保存在叶子节点中这样的好处在于:
一页能保存更多的索引