mysql是怎么依据索引提升查找效率的?
有如下一个mysql数据表,使用c2列创建索引,在磁盘上会生成一个索引文件表。下图以二叉树结构举例创建了一个索引表。在没有索引的情况下,要查找数据需要一行一行查找,搜寻一行就产生一次IO操作,效率上肯定是比较慢的。如果创建索引表,我们就可以先查询索引,再根据查找到的节点指向,就可以寻找到mysql数据表中对应的数据了。这样就减少了搜索次数,从而提高效率。
各数据结构创建索引对比
二叉树
每查找一个节点,就相当于一次IO操作。当一张表的数据十分庞大时,二叉树的深度就会变大,这样即使创建了索引其实对查询快慢也并没有提升多少。
B树
B树相对于二叉树而言,它在节点上可以存放多个不同节点,以此减小树的深度(上图举例中:每个节点最多存在三个,其实还可以有更多)。
分享一个在线演示生成B树的网站B-Tree Visualization
B+树
B+树相对于B树的改变在于;叶子节点包含了所有索引字段。叶子节点之间形成链表,且是一个升序链表。这样的好处:可以提高区间的访问性能,在项目中会存在大量的范围查询,在子节点中查找到了数据,就可以顺着链表依次向后查找,从而避免了全表查询。