Elasticsearch(es)为什么查询速度快?(速懂)

前言:在日常工作中,我们经常会使用到ElasticSearch,在大数据量亿级别的情况下使用它进行实时检索,速度非常快。但是却不知道它的原理是什么,采用什么方式进行检索。和mysql数据库有什么区别?一直都有困惑。


 

我花了一点时间学习一下,下面是我学习后整理出来的内容,希望对你们有帮助。

ES为什么查询速度快?

我写了一张比较简单的表:

  idnameage
1张三24
2李四25
3王麻子24

在mysql中,主键id建立b+树索引,然后通过目录页对应到数据页,然后找到数据。对于传统的增删改查(用id)没有任何问题,速度也很快。

查询非主键的字段如name或者age,则会使用到聚簇索引,因为用到了索引所以速度还是可以的。

但是对于全文检索来说。比如查询like %张三。这样是走不到索引的,需要全表扫描。所以大数据量情况下全表扫描速度非常慢。但是对于es来说,这就好办多了

es采用倒排索引

下面的的索引结构其实就是倒排索引。

比如查name:

TermPostingList(文档id集合)
张三【1】
李四【2】
王麻子【3】

查age:

TermPostingList(文档id集合)
25【2】
24【1,4】

Posting List

Elasticsearch会为每个field(文档)都建立了一个倒排索引,张三、李四、25、24…这些叫term,而[1,4]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id。

通过posting list这种索引方式似乎可以很快进行查找,比如要找age=24的同学,很快就会找到,id是1,4的同学。但是,如果有上千万的记录呢?如果是想通过name来查找呢?所以需要将Term进行排序

Term Dictionary
为了快速找到某个特定的term,将所有的term进行排序。再采用二分查找法查找term。时间复杂度logN
看起来,似乎和mysql数据库通过B-Tree的方式类似。而且Elasticsearch直接通过内存查找term,不读磁盘,但是如果term特别多的话,term dictionary也会很大,将所有的term dictionary都缓存到内存里是不太现实的。
Term Index
它包含的是term的一些前缀。所以term index 占用的空间只有term的的几十分之一。在内存里可以放更多的term index。缓存所有的term index到内存里是可以的。
Term Index,就像字典里的索引页一样,A开头的有哪些term,B开头的有哪些term,分别在哪页,可以理解term index是一颗树

如图:

 从term index查到对应的term dictionary之后,再去磁盘上找term,大大减少了磁盘随机读的次数,查询效率大大提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值