索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。常见的索引类型有:哈希表、有序数组、搜索树
哈希表
哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。
不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表,即链表法。
哈希表在等值查询时是很快的,但在区间查询时效率却非常慢。由于哈希存储时的数据并不是递增的,在区间查询时就必须全表扫描了。
应用于 Memcached 及其他一些 NoSQL 引擎
有序数组
有序数组在等值查询和区间查询时的性能都非常优秀。由于数组中的元素都是递增的,所以在查询时可以采用二分法查找,这个时间复杂度为O(log(N))。
在范围查询时也是一样,只要找到大于区间的左边,然后向右遍历找到区间的右边。这样的效率也是很快的。
但有序数组也有个缺点是更新插入时效率很差,原因在于新插入一个数据时,数组需维护有序状态,所以会将插入位置后面的数据往后挪,这样所花的成本太高。
所以,有序数组索引只适用于静态存储引擎,比如你要保存的是 2018 年某个城市的所有人口信息,这类不会再修改的数据。
搜索树
先