数据库索引

数据结构

索引的出现是为了提高查询效率,本质上也是用空间换时间,索引三种比较常见的数据结构有哈希表、有序数组和搜索树。

哈希表

哈希表是一种以键 - 值(key-value)存储数据的结构,我们只需要输入待查找的键即key,就可以找到对应的值即value。哈希的思路很简单,把值放在数组里——用一个哈希函数把 key 换算成一个确定的位置(这个位置也叫哈希槽),然后把 value 放在数组的这个位置。

哈希槽中存放相同的key就会产生哈希碰撞,处理这种情况的一种方法是拉出一个链表。

因为散列函数的随机性,哈希槽中的key也不是顺序的,所以哈希索引做区间查询的速度很慢,必须全部扫描一遍。

所以,哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。

有序数组

有序数组在等值查询和范围查询场景中的性能都非常优秀。

试想一下,要查询ID_card_n2对应的name,用二分法就可以快速得到,时间复杂度为O(logN)。

要对[ID_card_X, ID_card_Y]区间的记录做范围查询,可以先用二分法找到ID_card_X,然后向右遍历,直到查到第一个大于ID_card_Y的记录,退出循环。

如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。

所以,有序数组索引只适用于静态存储引擎,比如你要保存的是 2017 年某个城市的所有人口信息,这类不会再修改的数据。

搜索树

二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也都为二叉搜索树

以二叉搜索树为例,要查到id为ID_card_n2这条记录是以UserA->UserC->UserF->User2这个路径得到的,这个时间复杂度是O(logN)

当然为了维持 O(logN) 的查询复杂度,你就需要保持这棵树是平衡二叉树。为了做这个保证,更新的时间复杂度也是 O(logN)

二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上

你可以想象一下一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间,这个查询可真够慢的

为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N 叉”树。这里,“N 叉”树中的“N”取决于数据块的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值