一.数据结构
1. 二叉树
特点:左侧子节点比父节点小,右侧子节点比父节点大(对于同一个父节点下的两个子节点)
缺点:对于一直递增得数据不能存在该数据结构中,会变成链表,不能降低树的高度
图 1-1
图1-2
2. 红黑树
特点:左侧子节点比父节点小,右侧子节点比父节点大、或者相等(对于同一个父节点下的两个子节点),对于一直递增的数据可以自动平衡
缺点:对于百万条数据,树的高度还是太高
3. Hash表
优点:对数据进行Hash(散列)运算,主流的Hash算法有MD5、SHA256等等,然后将哈希结果作为文件指针可以从索引文件中获得数据的文件指针,再到数据文件中获取到数据,按照这样的设计,我们在查找where Col2 = 22的记录时只需要对22做哈希运算得到该索引所对应那行数据的文件指针,从而在MySQL的数据文件中定位到目标记录,查询效率非常高。
缺点:无法解决范围查询(Range)的场景,比如 select count(id) from sus_user where id>10;因此Hash这种索引结构只能针对字段名=目标值的场景使用。不适合模糊查询(like)的场景
4. B-树
特点:叶节点具有相同的深度,叶节点的指针为空,所有索引元素不重复,节点中的数据从左到右递增排列
缺点:存储的数据量没有B+树多,B树不支持range-query
(区间查询)
图1-3
5. B+树
特点:非叶子节点不存储data,只存储索引(冗余),可以放更多的索引,叶子节点包含所有索引字段,叶子节点用指针链接,提高区间访问的性能。
与B-树对比:B+树有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query(区间查询)非常方便,而B树不支持。
图 1-4