名词解释
b树是指平衡多路查找树(即不止两个子树),b+树可以理解为b树的延伸优化版本。
b+树
特点 子节点会形成单向链表
- 关键字数和子树相同
- 非叶子节点仅包含关键码信息,叶子节点包含关键码以及含有这个关键码的记录的指针。所以查找时,B+树必须到达叶子节点才会命中。
- 叶子节点包含有兄弟叶子节点的指针,而且叶子节点的关键码值是有序的,有利于遍历。
- 所有的非叶子节点可看成是索引部分(稀疏索引)
总结
- B+树的磁盘读写代价更低
非叶子节点包含的信息更少,如果把同一节点的所有信息放在一个磁盘块中,则可以比B树放入更多的关键码(b树是)。一次读入内存当中(读一个块)就能读入更多的关键码,所以降低了磁盘I/O总数。
- 查询效率更加稳定
对任何关键字的查找都必须从根节点走到叶子节点,路径长度相同,所以对每条数据的查询效率相当。
- B树在提高磁盘I/O性能的同时并没有解决元素遍历效率低下的问题。而B+树因为叶子节点有链指针存在,所以遍历叶子节点即可以实现对整棵树的遍历。而在数据库中基于范围的查询是非常频繁的,B+树就能更好的支持。
索引失效原理
特点
索引的排序规则: 当有联合索引的时候,左边的小,右边的大。
最左前缀法则 查找的时候,先查看最左边的数据。是否能匹配索引,如果能匹配,就依次往右匹配。
- 但如果无法匹配最左边的数据,就会导致无法命中索引。
- 右边的索引,是根据坐标的索引首位,从大到小依次排序。
结论
- or、!=、like = “%info” 、in 等无法触发索引。
- WHERE字句的查询条件里使用了函数,MYSQL将无法使用索引
- 用自增id作为主键id,效果会很好。
- 不同的数据较多,适合构建索引。比如0,1不适合索引
根据索引查找数据
非聚簇索引 (myisam)
特点: 索引文件与数据文件分开存储
非聚簇索引,就是数据与索引的值分开存储。
需要先从第一个表中的b+树,查到相应的主键下边的内存地址,再根据内存地址去查询具体的数据。
需要查询两次,因此效率会相对比较低
聚簇索引
特点:索引文件与数据文件存在一起。
聚簇索引就是索引与数据存在一起,可以一次就能查到数据。比较快捷(对比非聚簇索引)
索引分为两种,一种是主键索引,一种是非主键索引。
主键索引树 把数据和主键id为索引的key,利用b+树的结构存在一起。
辅助索引树 添加索引的字段,会独立构建成一个辅助树。但辅助树只存该字段的内容,想要查全部的数据,还会到主键索引去找。
结论
辅助索引 select * 的效率会变低许多。如果非业务需要,尽量少使用这种写法。