Elasticsearch簡介
術業有專攻!說Elasticsearch在搜索方面比mysql強大,倒不如說MySQL本身也不是為了查詢大量的資料而誕生的,MySQL創建之初就是為了做大量資料存盤來使用的!
Elasticsearch是海量資料查詢搜索引擎,廣泛用于全文檢索、日志分析、監控分析等場景,
關于全文檢索需要理解的就是:全文資料庫是全文檢索系統的主要構成部分,所謂全文資料庫是將一個完整的資訊源的全部內容轉化為計算機可以識別、處理的資訊單元而形成的資料集合,全文資料庫不僅存盤了資訊,而且還有對全文資料進行詞、字、段落等更深層次的編輯、加工的功能(也即是分詞的功能),而且所有全文資料庫基本都離不開有海量的資訊資料庫
ES三大特點:
-
輕松支持各種復雜的查詢條件:分布式實時檔案存盤,采用倒排索引及自定義打分、排序能力與豐富的分詞插件等,實作復雜查詢條件的全文檢索需求,
-
可拓展性強:天然支持分布式存盤,可簡單實作上千臺服務器的分布式橫向火絨,
-
高可用,容災性能好:通過主備節點及故障自動檢測與恢復,實作高可用,
Elasticsearch與mysql的概念對比:
| Elasticsearch | MySQL |
|---|---|
| Index(索引) | Dotobase(資料庫) |
| Type(型別) | Table(資料表) |
| Dcoument(檔案) | Row(行) |
| Mapping | Schema |
| Fields(欄位) | Column(列) |
那么Elasticsearch的索引為何這么高效,能在海量的資料中達到秒級甚至毫秒級的效果呢?最主要的原因就是它所用的倒排索引方式生成索引,避免全文掃描
倒排索引
說明:正排索引說的是通過檔案來查找關鍵詞,而倒排索引反之,是通過關鍵詞來查找檔案的形式
通常 如果要正排索引,那么要把每個檔案的內容拿出來查找是否有此單詞,毫無疑問這樣的話會導致全表掃描,那么用倒排索引會怎么查找呢,它首先會將每個檔案內容進行分詞,然后建立每個分詞與包含有此分詞的檔案之前的映射關系,如果有多個檔案包含此分詞,那么就會按檔案的權重將檔案進行排序
關于查找資料時為什么要選Elasticsearch
起初在創建專案的時候需要通過標題或是其他進行大量的模糊查詢,資料量比較大,用MySQL進行查詢就會相對吃力,這個時候就需要用到全文搜索的一種工具,而elasticsearch作為現如今非常火熱的一種全文檢索的工具,也就被優先使用了起來,
查詢方面mysql的不足
說了這么多Elasticsearch的關于查詢海量資料的好處,那么mysql在查詢大量資料的時候到底有什么不足的地方,
帶著這個問題跟大家說一下mysql對于查詢資料來說所存在的不足
上述也提到了MySQL在當時誕生之初設計團隊就希望它用來做海量資料存盤,并不是為了應對海量資料下各種復雜條件的查詢,說MySQL創建索引,不是可以提升查詢速度嗎,為什么說它不適合海量資料查詢呢,有兩個原因:
1、加索引確實可以提升查詢速度,但我們知道存盤都是需要成本的,如果你針對每一種情況都加索引,每加一個索引,就會創建一顆 B+ tree,如果是海量資料,將會大幅度增加存盤成本,況且在 MySQL 中加多個索引最終在執行 SQL陳述句 的時候它依然會選擇成本最低的那個索引,如果沒有索引滿足搜索條件,就會觸發全表掃描,因此得出索引并不是建得越多越好,
2、依然會有些查詢條件是 MySQL 加索引都沒辦法解決的!
結合這兩點,我們知道,MySQL的查詢能力還是有限的!
Elasticsearch其他有利于查詢的功能
除了我們所提到的倒排索引以外,Elasticsearch分布式同樣讓其適合資料查詢:
一個集群有多個node節點組成,每個index(索引)也是以分片的資料存在以多個node節點上,然后當有查詢條件請求過來的時候,分別在各個node查詢相應的結果并整合后便可,將查詢壓力分散到各個節點上,也避免了其對于磁盤、記憶體等處理能力與空間的不足
它還采用了主備分片提升搜索吞率,使用節點故障探測,RESTful的選主機制等提升了容災能力等等(因為Elasticsearch是基于RESTful web介面),總之經過上面的簡單總結大家只需要明白一點:Elasticsearch的分布式架構設計初衷就是為了支持海量資料查詢,
最后說一句,Elasticsearch在查詢海量資料的時候占盡了優勢,但是一般情況下在沒有那么大的查詢量時,也不一定要選用,因為Elasticsearch本身會占用了很大一部分運行記憶體!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356074.html
標籤:其他
