一、二叉搜索树:会退化到链表
二、AVL树(严格的平衡二叉树)
需要满足所有节点的左右子树高度差不超过1,只要不满足,就要通过旋转来保持平衡,不适用于频繁添加、删除操作
三、红黑树(弱平衡二叉树)
存在树高度较高 的问题
四、B+树
B+树:非叶子节点不存放data,只存储索引(冗余),可以放更多索引
五、MyISAM存储引擎与Innodb存储引擎
MyISAM存储引擎与Innodb存储引擎是对于表而言的。
MyISAM存储引擎对应的表与Innodb的区别:
1.InnoDB支持事务,MyISAM不支持;
2.InnoDB是聚集索引,数据文件和索引绑定在一起,必须要有主键,通过主键索引效率较高。但辅助索引需要两次查询,先查询到主键,然后通过主键查询到数据。
MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
MyISAM存储引擎:(非聚集索引:索引和数据分开存储)
首先判断where后面的col1是不是索引字段,如果是,则从MYI文件(B+树)中进行查找,然后找到30对应的地址,再从MYD文件中查找数据。
Innodb存储引擎 (聚集索引:索引和数据在一个文件夹中存储-----叶子节点包含完整的数据记录)
不用回表:查询效率高
为什么InnoDB表必须要有主键,并且推荐使用整型的自增主键?
如果没有指明主键,MySQL会查找没有相同值的列作为主键,如果所有列都有相同值,则会新建一个隐藏列作为主键。因为需要主键帮助维护B+树,整型比较大小快,整型存储空间小,自增避免了树的重新平衡。
六、hash索引与B+索引的区别
Hash表计算索引的哈希值,进而得到数据的地址。不支持区间查找
B+树支持区间查找。
- 如果是等值查询,那么哈希索引具有明显的优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
- 如果是区间索引,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
- 哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询
联合索引:安装各个主键索引进行排序