Elasticsearch為什么查詢速度快?(簡單易懂)


前言
在日常工作中,我們經常會使用到ElasticSearch,在大數據量億級別的情況下使用它進行實時檢索,速度非常快。但是卻不知道它的原理是什么,采用什么方式進行檢索。和mysql數據庫有什么區別?一直都有困惑

我花了些時間學習了一下。下面是我整理的內容,希望可以對大家有幫助

一、ES為什么查詢速度快?
下面是一張表的數據:

id name age
1 張三 24
2 張四 23
3 李四 23
4 李五 24
在mysql中,主鍵id建立b+樹索引,然后通過目錄頁對應到數據頁,然后找到數據。對於傳統的增刪改查(用id)沒有任何問題,速度也很快。
查詢非主鍵的字段如name或者age,則會使用到聚簇索引(面試常會考)因為用到了索引所以速度還是可以的。
但是對於全文檢索來說。比如查詢like %張三。這樣是走不到索引的,需要全表掃描。所以大數據量情況下全表掃描速度非常慢。但是對於es來說,這就好辦多了

es采用倒排索引
下面的的索引結構其實就是倒排索引。
name:

Term Posting List(文檔id集合)
張三 【1】
張四 【2】
李四 【3】
李五 【4】
age:

Term Posting List(文檔id集合)
23 【2,3】
24 【1,4】
Posting List
Elasticsearch會為每個field都建立了一個倒排索引,張三、李四、23、24…這些叫term,而[1,4]就是Posting List。Posting list就是一個int的數組,存儲了所有符合某個term的文檔id。

通過posting list這種索引方式似乎可以很快進行查找,比如要找age=24的同學,很快就會找到,id是1,4的同學。但是,如果有上千萬的記錄呢?如果是想通過name來查找呢?所以需要將Term進行排序

Term Dictionary
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,分別在哪頁,可以理解term index是一顆樹
如圖:

從term index查到對應的term dictionary之后,再去磁盤上找term,大大減少了磁盤隨機讀的次數,查詢效率大大提升


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM