哈希索引:hash索引的随机查找的时间复杂度为O(1).可以一次定位。索引hash索引的查询效率很高,但是弊端就是对于单个查找比如等值查找很方便。因为哈希索引比较的就是就行hash运算后的hash值。但是如果是范围查找,哈希过后的hash值和要查找的范围大部分情况下是不连续的,所以会慢。
二叉树索引:二叉树不适合做索引结构,二叉树做索引结构树的高度会越来越高,索引单边增长。会导致查询时间复杂度为O(n)。尤其是二叉树不平衡的时候深度可达到N。则复杂度为O(n)。mysql每次查询索引随着高度增加,那么查询磁盘的次数就会越多。
红黑树索引:红黑树也不适合做索引结构,因为红黑树的高度也是会随着数据量越来越高。虽然查询复杂度为O(logn)。但是比如mysql,每次查询索引需要访问磁盘,那么随着高度越高,查询磁盘的次数就会越多,性能就会越差。其实红黑树在内存中要比B+树性能要好,但是基于mysql,索引存在磁盘上,所以相比B+树更好点
B树索引:其实就是在索引的横向上做了文章,让每个节点可以存储更多的索引。每个索引存储着对应的数据磁盘指针。减少了树的高度,也就减少了访问磁盘的次数。对性能有所提高。
B+树索引:在B树索引上进行了优化,也是减少了树的高度,向横向做文章,但是B+树索引并不是所有的索引都存储对应数据的磁盘指针。而是只有叶子节点才会存储对应的磁盘指针。而非叶子节点就会存储更多的索引。叶子节点之间的索引之间也有指针关联。为了方便范围查找。时间复杂度O(logN).
LSM树索引:为了适应写多读少的场景,比如hbase. 分为内存部分和磁盘部分。内存数据结构可以选择红黑树,跳跃表等来维护有序数据结构。这里考虑并发性能,hbase选择了跳跃表来维护有序的KV集合。hbase的flush操作也是通过两个跳表来刷到文件中的。hbase为了弥补读的性能。通过多路归并,compact,布隆过滤器,BlockCahce来优化读。