名词解释

b树是指平衡多路查找树(即不止两个子树),b+树可以理解为b树的延伸优化版本。

b+树

特点 子节点会形成单向链表

位图索引和B树索引区别_子节点

  1. 关键字数和子树相同
  2. 非叶子节点仅包含关键码信息,叶子节点包含关键码以及含有这个关键码的记录的指针。所以查找时,B+树必须到达叶子节点才会命中。
  3. 叶子节点包含有兄弟叶子节点的指针,而且叶子节点的关键码值是有序的,有利于遍历。
  4. 所有的非叶子节点可看成是索引部分(稀疏索引)

总结

  1. B+树的磁盘读写代价更低

非叶子节点包含的信息更少,如果把同一节点的所有信息放在一个磁盘块中,则可以比B树放入更多的关键码(b树是)。一次读入内存当中(读一个块)就能读入更多的关键码,所以降低了磁盘I/O总数。

  1. 查询效率更加稳定

对任何关键字的查找都必须从根节点走到叶子节点,路径长度相同,所以对每条数据的查询效率相当。

  1. B树在提高磁盘I/O性能的同时并没有解决元素遍历效率低下的问题。而B+树因为叶子节点有链指针存在,所以遍历叶子节点即可以实现对整棵树的遍历。而在数据库中基于范围的查询是非常频繁的,B+树就能更好的支持。

索引失效原理

特点

索引的排序规则: 当有联合索引的时候,左边的小,右边的大。

位图索引和B树索引区别_子节点_02

最左前缀法则 查找的时候,先查看最左边的数据。是否能匹配索引,如果能匹配,就依次往右匹配。

  1. 但如果无法匹配最左边的数据,就会导致无法命中索引。
  2. 右边的索引,是根据坐标的索引首位,从大到小依次排序。

结论

  1. or、!=、like = “%info” 、in 等无法触发索引。
  2. WHERE字句的查询条件里使用了函数,MYSQL将无法使用索引
  3. 用自增id作为主键id,效果会很好。
  4. 不同的数据较多,适合构建索引。比如0,1不适合索引

根据索引查找数据

非聚簇索引 (myisam)

特点: 索引文件与数据文件分开存储

位图索引和B树索引区别_java_03

非聚簇索引,就是数据与索引的值分开存储。

需要先从第一个表中的b+树,查到相应的主键下边的内存地址,再根据内存地址去查询具体的数据。

需要查询两次,因此效率会相对比较低

聚簇索引

特点:索引文件与数据文件存在一起。

位图索引和B树索引区别_java_04

聚簇索引就是索引与数据存在一起,可以一次就能查到数据。比较快捷(对比非聚簇索引)

索引分为两种,一种是主键索引,一种是非主键索引。

主键索引树 把数据和主键id为索引的key,利用b+树的结构存在一起。

辅助索引树 添加索引的字段,会独立构建成一个辅助树。但辅助树只存该字段的内容,想要查全部的数据,还会到主键索引去找。

结论

辅助索引 select * 的效率会变低许多。如果非业务需要,尽量少使用这种写法。