索引的定义
索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那寻找起来是很费劲的。同样,对于数据库的表而言,索引其实就是它的“目录”。
索引的常见模型
哈希表
哈希表是一种以**键 - 值(key - value)**存储数据的结构,只要输入待查找的键即key,就可以找到其对应的值即Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。
不可避免地,多个key值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。
假设,现在维护者一个身份证信息和姓名的表,需要根据身份证号查找对应的名字,这是对应的哈希表索引的示意图如下:
图中,USER2和USER4根据身份证号算出来的值都是N,但没关系,后面还跟了一个链表。假设要查找ID_2对应的名字,处理步骤就是首先,将ID_2通过哈希函数算出N;然后,按顺序遍历,找到USER2。
需要注意的是,图中四个ID_N的值并不是递增的,这样做的好处是增加新的User时速度会很快,只需要往后追加。但缺点是,因为不是有序的,所以哈希索引做区间查询速度很慢,要全表扫描。
所以,哈希表这种结构适用于只有等值查询的场景,比如Memcached以及其他一些NoSQL引擎。
有序数组
有序数组在等值查询和范围查询场景中的性能就都非常优秀。还是这个根据身份证查名字的例子,如果使用有序数组来实现的话,示意图如下所示:
假设身份证号没有重复,这个数组就是按照身份证号递增