1. 程式人生 > 其它 >Elasticsearch為什麼查詢速度快?(簡單易懂)

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,大大減少了磁碟隨機讀的次數,查詢效率大大提升