elasticsearch为什么比关系型数据库快

 要知道eselasticsearch为什么比关系型数据库快的原因必须先了解2者建立索引的过程

 

ES建立索引的过程(原理是基于lucene的倒排索引)

第一步:分词、倒排索引(每一个词都有自己的倒排索引的list)

原始文档如下:

索引后:

注意:18,20这些叫做 term,而[1,3]就是posting list

 

第二步:对team进行排序,通过二分查找形成 term dictionaryb-tree算法

term dictionary对team进行排序后二分查找,算法复杂度logN。但是要经历多次磁盘读取(一次random access大概需要10ms的时间)

 

第三步:为了减少磁盘读取的次数,需要将一些数据缓存到磁盘中,但是term dictionary太大,无法全部放到内存中,于是根据term dictionary建了team index ,term index有点像一本字典的大的章节表比如:A开头的term ……… Xxx页;C开头的term ……… Xxx页;E开头的term ………Xxx页。如果所有的term都是英文字符的话是一棵如下的这棵树不会包含所有的term,它包含的是term的一些前缀

再次压缩后,term index 的尺寸可以只有所有term的尺寸的几十分之一

 

为什么Elasticsearch/Lucene检索可以比mysql快

Mysql只有term dictionary这一层,是以b-tree排序的方式存储在磁盘上的。检索一个term需要若干次的random access的磁盘操作。而Lucene在term dictionary的基础上添加了term index来加速检索,term index以树的形式缓存在内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘的random access次数。额外值得一提的两点是:term index在内存中是以FST(finite state transducers)的形式保存的,其特点是非常节省内存。Term dictionary在磁盘上是以分block的方式保存的,一个block内部利用公共前缀压缩,比如都是Ab开头的单词就可以把Ab省去。这样term dictionary可以比b-tree更节约磁盘空间。

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值