数据库索引


​ 索引用于帮助我们快速找到想要的数据,Mysql的索引是B+树,Redis的索引是hash,HBase的索引是LSM树等等

​ 没有最好的索引,只有最适合的索引。不同的索引是为了解决不同的问题而实现的

Hash

​ 这里就不详细将Hash的原理了。Hash查询的时间复杂度是O(1)的,速度快。但是hash只适合随机查找,不适合范围查找,因为它是无序的,因此也不支持排序。

​ 而且当key多到内存装不下的时候,hash索引必然有一部分会存储到磁盘上。而磁盘上hash的效率就特别慢了。

B+树

​ B+树查找的时间复杂度为O(logn),但它支持范围查找和排序

​ 说B+树前,先说一下它的基石,对于平衡树中的各种细分的种类,它们的大概关系为:

​ 平衡树是对二叉搜索树的改进,红黑树是对平衡树的改进,B树是对红黑树的改进,B+树是对B树的改进。

​ 对于二叉搜索树而言,它综合了数组和链表的优点,它无论是插入还是查找某个元素,平均复杂度都是O(logn)

​ 二叉搜索树可能造成最坏情况O(n)的复杂度(当成一条直线时),这时候我们对二叉搜索树进行改进,让其在插入元素后仍保持平衡(这样就可以维持O(logn)的时间复杂度),它们是通过左旋右旋操作实现的

​ 红黑树相比平衡树,通过引入红黑节点变色操作。损失了一定的平衡性,但是减少了旋转操作的次数,增强了效率。

​ 当数据量特别大的时候,就需要将数据存到磁盘上。由于磁盘的IO查找速度很慢,如果二叉树的层数很多,就需要多次转动磁盘,效率很低。如果我们允许一个节点存储多个元素(由于磁盘实际读取会读取一个磁盘快大小到内存,大概为4k,这样我们把一个节点的大小设置为4k刚好),这样就可以降低树的高度,减少IO磁盘转动的次数,这就是B树

​ 我们可以在B树的基础上,尽可能更多的一个节点读取更多的信息,这就有了B+树。B+树在内部节点中只存储索引字段而不是数据内容,这样节点的存放数据量更多,树的高度更低,IO磁盘转动的次数更少。除此之外,sql中经常会有范围查找,B树只能遍历范围内的每个节点,然后挨个查找。而B+树会将叶子结点会通过指针链接起来。这样范围查找可以直接通过这条链表从范围的起始位置走到结尾。

​ 大概1TB的内容只需要B+树的4层。在此基础上,我们可以一直把B+树的根节点保存在内存中减少一次IO操作。

​ 当B+树面对海量数据的时候也会显得力不从心,毕竟每次写入数据前都先要查找数据应该写入的位置。而且当需要分库分表时(当数据超过两千万左右时,避免B+树的高度增加于是分库分表)特别麻烦。

LSM TREE

​ 在NoSql数据库中(非关系型数据库)使用LSM Tree,它将磁盘的顺序写发挥到极致,适用于大规模数据量写入。

倒排索引

​ 用于全文检索(例如搜索一个词,把所有出现这个词的网页都显示出来)。是通过分词和字典树来实现的。

​ 它会把每个网页中的词都单独拿出来,扔到集合中,比如hashmap(这里的key是单词,value是包含这个单词的所有文章的编号列表)

​ 当数据量少的可以用hashmap或者平衡树,当数据量大的时候就可以使用字典树了(在字典树节点中存储这个单词所有文章的编号列表)

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值