一、索引的类型
1.1 B-Tree索引还是B+Tree索引?
当人们谈论索引时,如果没有特别指明类型,那多半说的是B-Tree索引。实际上很多存储引擎使用的是B+Tree,即每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子结点的遍历。
———— 《高性能MySQL》
MySQL最常用的InnoDB和MyISAM引擎的索引结构就是B+Tree
B+Tree结构:
B+Tree索引能加快访问数据的速度,是因为存储引擎不再需要进行全表扫描,取而代之的是从索引根节点(图中未画出)开始进行搜索的。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点
1.2 B+Tree和B-Tree的区别
主要有以下区别:
1、B-Tree的非叶子节点会存储data,而B-Tree非叶子节点只存储key(查询效率稳定)
2、B-Tree任何关键字出现且只出现在一个节点中,而B+Tree下层结点包含上层关键字
3、B+Tree所有叶子节点之间增加了链指针(优化range扫描)
4、B树的查询效率与键在B树中的位置有关(因为只出现一次),而B+树的复杂度对某个建成的树是稳定的(访问到叶子结点)
1.3 MyISAM与InnoDB B+Tree的区别
1、第一个重大区别是InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的。InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。MyISAM按插入顺序存储数据,并生成行号。索引叶子节点指针指向行号和列值
2、第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域(所有叶子节点指向主键索引)。
参考资料:
https://www.cnblogs.com/tgycoder/p/5410057.html