实际生产中我们大多都采用的innodb存储引擎,并且使用的是B+tree索引,那么为什么是B+tree索引知道么.今天来分析下
长见的树有如下:
二叉树 binary search tree
平衡二叉树 balanced binary search tree
多路查找树(B-tree)
B+tree
各自有各自的优缺点.我们先说二叉树,顺便推荐个数据结构可视化的在线连接,十分方便https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
如上图我们如果查找20需要经过30和21即可命中,但是极端情况下会出现如下图所示:
会退化成一个链表,此时我们查询20需要遍历整个链表才能命中查询效率随着链表长度大大降低
再看平衡二叉树平采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度
特点:
非叶子节点最多拥有两个子节点,
树的左右两边的层级数相差不会大于1;
没有值相等重复的节点;
非叶子节值大于左边子节点、小于右边子节点;
由此我们可以知道,随着表中的数据量主键增大,平衡二叉树的高度会急剧升高,增大了磁盘io的次数,大大降低的查询效率,并且节点保存的数据量太小,没有很好的利用磁盘的预读能力
再看B-tree也叫绝对平衡的多路查找树,相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小一般为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度;
再看B+tree ,他比B-tree更加强大,他的根节点和支节点不在存储数据相关的信息.只保存了关键字和子节点的引用,这样更充分的利用了节点的空间,比B-tree拥有更多的路数.更少的层级.遍历速度也更快
并且叶子节点保存了数据,天然的排序.并且相邻节点具有顺序引用的关系
Mysql B+Tree索引体现形式:
在myisam中虽然也是采用的B+tree索引,但是叶子节点中存储的是该行数据的地址位置信息,而innodb中是叶子节点存储的是实际的相关数据,所以相比innodb而言myisam多了一次io操作.查询效率更低
实际场景中我们的表不止一个列有索引,更据实际业务场景可能存在多个列都有索引,其实辅助索引中的叶子节点只是存储了主键索引中的指针而已.
至此mysql中的索引扫盲分析结束,如有错误之处望留言指出