索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去找。
mysql 的底层索引的数据结构是B+树,那为什么是B+树呢?为什么不是哈希索引?为什么不是平衡二叉树?以及为什么不是B树
在这里给大家分享一下这个网站https://www.cs.usfca.edu/
可以非常直观的看到数据结构的一系列变化 让我们更容易看懂
先看hash索引
众所周知Hash结构查找和插入都很快 ,假如我们要找5那么它就可以根据索引直接找到5
那么为什么Mysql没有采用Hash来构建呢?原理其实很简单,Hash索引是无序的,如果是无序的话你就不能进行这个范围查找
比如select id from tb where t.num>10 and t.num<20这样子
而且有时候值不同Hash值相同,那么还得一个个比对,效率也会降低
再来看看平衡二叉树
假设我们找10的话就需要比对3次,次数根据树的高度来算,算是平衡二叉树的一个缺点,除此之外还有一个缺点,依旧是大于小于的范围查找问题。假设我们要查找大于5 的数
那么找到5以后需要回旋一个一个去拿数字,假如数据比较多那么速度就会变得很慢。
再看一下平衡二叉树升级版 B树(B-树)
他一个节点存储两个值的方式降低了平衡二叉树的一个高度问题,你越矮查找就越快嘛,同样找5,二叉树走了3次而B树走了2次。那么B树解决了回旋查找(范围查找)的问题嘛?答案是没有 它也得一个一个回去找…
再看一下B+树
其实跟B树没有太大区别,只是底部多了一个链表,这个链表是排序过的,由此可以解决范围查找–查找大于5的数直接把5后面全部拿出来即可。而且它的子节点是只存了Key的单值,而链表的节点存了key+value两个值。
总结:hash索引查找快但是无法范围查找,AVL trees查找速度基于树的高度,可以进行范围查找但是速度较慢
B- trees查找速度优于AVL trees 但是范围查找速率和AVL trees一样,最后就是B+ trees, 结合了B- trees 优于AVL trees查找速度的优点 再结合单向有序链表使范围查找的速度也加快了。