精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么 ElasticSearch 比 MySQL 更適合復雜條件搜索

數據庫 MySQL
Elasticsearch 是開源的實時分布式搜索分析引擎,內部使用 Lucene 做索引與搜索。它提供"準實時搜索"能力,并且能動態集群規模,彈性擴容。

 [[382143]]

本文轉載自微信公眾號「程序員歷小冰」,作者歷小冰。轉載本文請聯系程序員歷小冰公眾號。

熟悉 MySQL 的同學一定都知道,MySQL 對于復雜條件查詢的支持并不好。MySQL 最多使用一個條件涉及的索引來過濾,然后剩余的條件只能在遍歷行過程中進行內存過濾,對這個過程不了解的同學可以先行閱讀一下《MySQL復雜where條件分析》。

上述這種處理復雜條件查詢的方式因為只能通過一個索引進行過濾,所以需要進行大量的 I/O 操作來讀取行數據,并消耗 CPU 進行內存過濾,導致查詢性能的下降。

而 ElasticSearch 因其特性,十分適合進行復雜條件查詢,是業界主流的復雜條件查詢場景解決方案,廣泛應用于訂單和日志查詢等場景。

下面我們就一起來看一下,為什么 ElasticSearch 適合進行復雜條件查詢。

ElasticSearch 簡介

Elasticsearch 是開源的實時分布式搜索分析引擎,內部使用 Lucene 做索引與搜索。它提供"準實時搜索"能力,并且能動態集群規模,彈性擴容。

Elasticsearch 使用 Lucene 作為其全文搜索引擎,用于處理純文本的數據,但 Lucene 只是一個庫,提供建立索引、執行搜索等接口,但不包含分布式服務,這些正是 Elasticsearch 做的。

下面,我們來介紹一下 ElasticSearch 的相關概念。為了便于初學者理解,我們先將 ElasticSearch 中的概念和 MySQL 中的概念大致地進行對應。但是二者在具體細節上還是有很多差異的,大家深入了解 ElasticSearch 就會將二者區分清楚,不能強行對比等同。

  • ElasticSearch 中的索引 Index 類似于 MySQL 中的數據庫 Database;
  • ElasticSearch 中的類型 Type 類似于 MySQL 中的表 Table;需要注意,這個概念在 7.x 版本中被完全刪除,而且概念上和 Table 也有較大差異;
  • ElasticSearch 中的文檔 Document 類似于 MySQL 中的數據行 Row,每個文檔由多個字段 Filed 組成,這個Filed 就類似于 MySQL 的 Column;
  • ElasticSearch 中的映射 Mapping 是對索引庫中的索引字段及其數據類型進行定義,類似于關系型數據庫中的表結構 Schema;
  • ElasticSearch 使用自己的領域語言 Query DSL 來進行增刪改查,而 MySQL 使用 SQL 語言進行上訴操作。
  • ElasticSearch 還有一系列有關其分布式特性的概念,我們這里就暫不介紹了,等后續學習到其分布式特性時在進行介紹。

倒排索引

MySQL 有 B+ 樹索引,而 ElasticSearch 則是倒排索引 (Inverted Index),它通過倒排索引來實現比 MySQL 更快的過濾和復雜條件的查詢,此外,全文搜索功能也是依賴倒排索引才能實現。下面,我們就具體來看一下何為倒排索引。

倒排索引按照維基百科的描述,是存儲文檔內容到文檔位置映射關系的數據庫索引結構。不過只看定義,我是有點迷惑,這不是和 MySQL 的非主鍵索引類似嘛,為什么要叫它“倒排”呢?這個問題我目前也為搞清楚,可能要等到后續了解了其具體實現才能理解。

我們還是以書籍檢索為例,假設有以下數據,每一行就是一個 Document,每個 Document 由 id,ISBN 號,作者名稱和評分組成。

給上述數據按照 ISBN 和 Author 建立的倒排索引如下所示。倒排索引是每個字段分開建立的,相互獨立。有兩個專門的術語,分別是索引 Term 和倒排表 Posting List。字段的值就是 Term,比如 N0007,而 Term 對應的文檔 ID 的列表就是 Posting List,對應圖中紅色的部分。

一般 Term 都是按照順序排序的,比如 Author 名稱就是按照字母序進行了排序,排序之后,當我們搜索某一個 Term 時,就不需要從頭遍歷,而是采用二分查找。一系列排序后的 Term 就組成了索引表 Term Dictionary。

但是 Term Dictionary 往往很大,無法完整放入內存,這是為了更快的查詢,還需要再給它創建索引,也就是 Term Index 。

ElasticSearch 使用 Burst-Trie 結構來實現 Term Index,它是一種前綴樹 Trie 的一種變種,它主要是將后綴進行了壓縮,降低了Trie的高度,從而獲取更好查詢性能。

Term Index 并不需要像 MySQL 的索引一樣,包含所有的 Term,而是包含的是這些 Term 的前綴。它就類似于字典的查詢目錄,可以進行快速定位到 Term Dictionary 的某一位置,然后再從這個位置向后查詢。

綜上, Alice,Alf,Arlan,Bob,Tom 等詞的倒排索引如下所示。綠色部分是 Term Index,藍色部分是 Term Dictionary,紅色部分是 Posting List。

一般來說,Term Index 都是全部緩存在內存中,查詢時,先通過其快速定位到 Term Dictionary 對應的大致范圍,然后再進行磁盤讀取查找對應的 Term,這樣就大大減少了磁盤 I/O 的次數。

聯合索引查詢

了解了 ElasticSearch 的倒排索引后,我們再來看看其如何處理復雜的聯合索引查詢。比如上述書籍例子中,我們需要查詢評分等于2.2并且作者名稱叫 Tom的書籍。

理論上,我們只需要分別按照 Score 和 Author 字段的倒排索引進行查詢,獲取響應的 Posting List,再將其做交集合并即可。

這里又要吐槽一下 MySQL,它是不支持這個合并操作的,它只能按照一個字段的索引進行查詢,然后根據另外一個字段的條件做內存過濾。順便說一下,MySQL 的 join 功能也弱爆了,感興趣的同學可以了解一下這篇文章

而 ElasticSearch 則支持使用跳表 Skip List和 Bitset 的方式將數據集進行合并。

  • 使用 Skip List 結構,同時遍歷 Score 和 Author 查詢出來的 Posting List,利用其 Skip List 結構,相互跳躍對比,得出合集。
  • 使用 Bitset 結構,對 Score 和 Author 查詢出來的 Posting List 的值計算出各自的 Bitset,然后進行 AND 操作。

跳表合并策略

ElasticSearch 在存儲 Posting List 數據時,就保存了對應的多級跳表結構響應的數據,這也體現了其空間換時間的基本思想。

這里先介紹一下跳表的基本概念,它其實是一種可以進行二分查找的有序鏈表。跳表在原有的有序鏈表上面增加了多級索引,通過索引來實現快速查找。首先在最高級索引上查找最后一個小于當前查找元素的位置,然后再跳到次高級索引繼續查找,直到跳到最底層為止,通過這種方式,加快了查詢的速度。

比如,按照 Score 查出來的 Posting List 為[2,3,4,5,7,9,10,11],按照 Author 查出來的結果為 [3,8,9,12,13],則二者的跳表結構如下圖所示。

具體合并過程則是先選最短的 posting list,也就是 Author 的結果集,從其最小的一個 id 開始,將其作為當前最大值。然后依次剩余 posting list 中查找大于或等于該值的位置。

比如上述結果集中,先去 Score 結果集中查找 3,找到后,就表明 3是二者的合集元素之一;然后再重新開啟一輪,選取 Author 結果集中 3 的下一個值 8 ,去 Score 結果集查詢 8,發現了大于等于 8 的最小的值是 9 ,所以不可能有共同的值 8,然后再去 Author 結果集查找 9 ,發現其大于等于 9 的最小值是 12,所以再去 Score 結果集中查找大于等于 12的值,發現并不存在;最終得出二者的合集就只有[3]。

在查詢過程中,每個 posting list 都可以根據當前 id 通過 skip list 快速跳過不符合的 id 值,加速整個合并取交集的過程。

ElasticSearch 對于較長的 posting list 也會使用 Frame Of Reference 進行壓縮編碼,減少了磁盤占用,減少了索引尺寸。有關具體存儲結構的實現我們后續再進行細聊。

Bitset 合并策略

ElasticSearch除了使用 skipList 來進行數據磁盤讀取時的合并操作外,還會將一些查詢條件對應的結果集 posting list 進行內存緩存,也就是所謂的 Filter Cache,為了后續再次復用。

為了減少內存緩存所消耗的內存空間大小,ElasticSearch 沒有使用單純的數組和 bitset 來存儲 posting list,而是使用要壓縮效率更高的 Roaring Bitmap。

我們可以先來講一下單純數組或 bitset 數據結構為什么并不使用。比如如下一道較為常見的面試題目:

給定含有40億個不重復的位于[0, 2^32 - 1]區間內的整數的集合,如何快速判定某個數是否在該集合內?

如果我們要使用 unsigned long 數組來存儲它的話,也就需要消耗 40億 * 32 位 = 160 Byte,大致是 16000 MB。

如果要使用位圖 Bitset 來存儲的話,即某個數位于原集合內,就將它對應的位圖內的比特置為1,否則保持為0。這樣只需要消耗 2 ^ 32 位 = 512 MB,這可只有原來的 3.2 % 左右。

但是,Bitset 也有其缺陷,也就是稀疏存儲的問題,比如上述集合并不是 40億,而是只有2,3個,那么 Bitset 中只有少數幾位是1,其他位都是 0,但是它仍然占用了 512 MB。

而 RoaringBitmap 就是為了解決稀疏存儲的問題。下圖就是 RoaringBitmap 的基本原理示意圖。

首先,如上圖所示,計算出32位無符號整數和 65536 的除數和余數。其含義表示,將32位無符號整數按照高16位分桶,即最多可能有2^16=65536個桶,術語懲治為 container。存儲數據時,按照數據的高16位找到 container(找不到就會新建一個),再將低16位放入container中。也就是說,一個 RoaringBitmap 就是很多container的集合。

然后 container 內具體的存儲結構要根據存入其內數據的基數來決定。

  • 基數小于 2 ^ 12 次方即 4096時,使用unsigned short類型的有序數組來存儲,最大消耗空間就是 8 KB。
  • 基數大于 4096 時,則使用大小為 2 ^ 16 次方的普通 bitset 來存儲,固定消耗 8 KB。當然,有些時候也會對 bitset 進行行程長度編碼(RLE)壓縮,進一步減少空間占用。

ElasticSearch 就是使用 Roaring Bitmap 來緩存不同條件查詢出來的 posting list,然后再進行與操作計算出最終結果集。

后記

至此,我們也算了解了 ElasticSearch 為什么比 MySQL 更適合復雜條件查詢,但是有好就有弊,因為為了查詢做了這么多的準備工作,ElasticSearch 的插入速度就會慢于 MySQL,而且數據存入ES后并不是立馬就能檢索到。

 

責任編輯:武曉燕 來源: 程序員歷小冰
相關推薦

2021-04-28 14:50:07

ElasticSearMySQL數據庫

2021-04-21 07:31:01

ElasticSearMySQLCPU

2021-01-15 10:52:10

PythonVBAExcel

2018-10-17 12:34:36

災難恢復云計算數據中心

2024-09-09 04:00:00

GPU人工智能

2010-11-24 10:16:04

Office 365Google Apps

2019-08-21 09:24:45

GPUCPU深度學習

2013-01-29 10:40:26

云環境應用程序開發

2013-01-29 08:43:32

應用程序開發PaaS

2011-12-07 20:43:33

2021-02-22 10:39:10

多云云計算云平臺

2021-03-22 08:29:59

Elasticsear搜索系統

2019-01-31 10:15:14

群聊單聊消息

2025-09-28 01:25:00

2009-11-05 18:50:04

Windows 7上網本

2009-09-04 11:26:00

英特爾虛擬化

2024-04-03 09:23:31

ES索引分析器

2010-07-13 16:15:49

XenServer5.6

2024-04-03 08:28:31

GolangPHP語言

2021-04-27 09:00:00

PythonIDE開發
點贊
收藏

51CTO技術棧公眾號

欧美日韩亚洲一二三| 欧美日韩另类丝袜其他| 久久久久久久久久久久国产| 成人线上播放| 欧美日在线观看| 亚洲高清不卡一区| 国产av无码专区亚洲av麻豆| 99在线观看免费视频精品观看| 亚洲人成人99网站| 国产伦精品一区二区三区妓女下载| 爱情岛论坛亚洲品质自拍视频网站| 久久先锋影音av| 91在线免费看网站| 狠狠人妻久久久久久综合| 91精品啪在线观看国产18| 亚洲精品理论电影| 国产福利精品一区二区三区| 亚洲一二三四| 夜夜嗨av一区二区三区网页 | 玖玖玖视频精品| 欧美日韩国产中字| 中文字幕一区综合| 黄色国产在线| www.亚洲在线| 亚洲一区二区三区久久| 黄色在线免费观看| 女人色偷偷aa久久天堂| 国产一区二区三区在线看| 人妖粗暴刺激videos呻吟| 国产精品成人国产| 色香蕉成人二区免费| 国产精品久久久久7777| 米奇777四色精品人人爽| 久久久精品免费观看| 99在线影院| 国产一区二区自拍视频| 三级在线观看一区二区| 日本精品久久中文字幕佐佐木| 久久久久亚洲天堂| 91精品高清| 久久精品电影网| 一级片黄色录像| 精品一区二区三区的国产在线观看| 日韩精品高清在线| 国产精品一区二区在线免费观看| 日本在线一区二区三区| 在线电影一区二区三区| 国内自拍第二页| 99er精品视频| 欧美日韩第一区日日骚| www.精品在线| 中文成人在线| 69p69国产精品| 韩国一区二区在线播放| 99久久99九九99九九九| 欧美一区二区三区日韩| 一级日本黄色片| 精品视频一区二区三区| 日韩三级免费观看| 稀缺呦国内精品呦| 好吊妞国产欧美日韩免费观看网站| 日韩欧美亚洲国产另类| 亚洲911精品成人18网站| 国产精品3区| 日韩欧美亚洲另类制服综合在线| 乱码一区二区三区| 好吊妞视频这里有精品| 亚洲精品国精品久久99热一| 亚洲天堂网一区二区| 亚洲国产网址| 三级精品视频久久久久| 午夜激情福利电影| 欧美日韩视频一区二区三区| 欧美精品www| 美日韩一二三区| 三级成人在线视频| 国产在线精品一区免费香蕉| 国产成人av免费看| 麻豆网站在线| 久久免费看少妇高潮| 日产精品久久久一区二区| 国产三级电影在线观看| **性色生活片久久毛片| 欧美狂野激情性xxxx在线观| 欧美大胆a人体大胆做受| 日韩欧美大尺度| 99sesese| 91久久精品无嫩草影院| 日韩成人在线播放| 国产99在线 | 亚洲| 在线一区免费| 欧美在线免费观看| 中文字幕视频一区二区| 高清在线成人网| 欧美一区二视频在线免费观看| 日本在线观看网站| 亚洲在线观看免费视频| 妞干网在线免费视频| 国产电影一区| 精品香蕉一区二区三区| 亚洲女人久久久| 日韩午夜在线电影| 91视频免费网站| 欧美大片aaa| www久久久| 亚洲精品日韩综合观看成人91| 久久久性生活视频| 国产成人77亚洲精品www| 日韩精品一区二区三区视频播放| 六月婷婷七月丁香| 欧美在线三区| 国产成人亚洲综合91精品| a天堂视频在线| 国产午夜精品在线观看| 日韩中文字幕在线不卡| 男人皇宫亚洲男人2020| 欧美一级片在线| 超薄肉色丝袜一二三| 亚洲高清自拍| 91精品视频播放| 国产福利小视频在线观看| 亚洲福利一区二区| 肉色超薄丝袜脚交| 久久国产电影| 国产成人综合精品| 国产成人av一区二区三区| 国产人妻精品一区二区三区| 久久综合久久鬼色| 亚洲 欧美 综合 另类 中字| 色综合一区二区日本韩国亚洲| 国产婷婷色综合av蜜臀av| 久久久久99精品成人片毛片| 国内精品伊人久久久久影院对白| 欧美在线一二三区| 综合另类专区| 日韩大陆毛片av| 国产在线观看免费av| 国产又粗又猛又爽又黄91精品| 日韩精品一区二区三区丰满| 欧美电影免费观看高清完整| 日韩av在线免费观看一区| 久久艹精品视频| 国产91精品一区二区麻豆网站| 正在播放久久| 亚洲网站免费| 久久精品亚洲一区| 国产免费黄色大片| 国产精品乱子久久久久| 一区二区三区视频在线观看免费| 欧美极品在线观看| 国产成人精品日本亚洲| 欧美成人综合在线| 欧美亚一区二区| 天美传媒免费在线观看| 九九视频精品免费| 国产卡一卡二在线| 国产激情综合| 国内精品久久久久久中文字幕| 国产91免费在线观看| 亚洲va韩国va欧美va| 一区二区三区少妇| 三级精品在线观看| 亚洲欧美日韩国产yyy| 日本免费成人| 久久久久一本一区二区青青蜜月| 国产女主播在线播放| 亚洲成人毛片| 欧美男插女视频| 国产成人三级一区二区在线观看一 | 亚洲一区二区三区中文字幕 | 9l视频自拍九色9l视频成人| 久久久久久18| 天天干天天干天天干| 欧美性生交xxxxxdddd| 久久久久无码精品国产sm果冻| 免费不卡在线观看| 欧美日韩午夜爽爽| 国产suv精品一区二区四区视频| 午夜精品久久久久久久久久久久| 日韩a在线看| 精品视频1区2区| 久久久久亚洲AV| 久久久精品tv| 97超碰人人看| 亚洲综合欧美| 一区二区三区四区不卡| 136福利精品导航| 欧美一区深夜视频| 精品国产99久久久久久| 亚洲国产精品成人va在线观看| 日本视频免费观看| 一区二区三区日韩精品视频| 欧美色图亚洲激情| 久久精品国产精品亚洲精品| 久草视频国产在线| 人人狠狠综合久久亚洲婷婷| 91网免费观看| 性欧美18一19sex性欧美| 萌白酱国产一区二区| 天堂8在线视频| 欧美精品高清视频| 日韩特级黄色片| 亚洲视频在线一区| 美女被到爽高潮视频| 高清国产午夜精品久久久久久| 国产情侣av自拍| 欧美精品导航| 亚洲黄色成人久久久| 欧美亚洲国产日韩| 91免费看网站| 九七影院97影院理论片久久| 国内精品久久久久久久| a级网站在线播放| 亚洲天堂男人的天堂| 黄频在线免费观看| 3751色影院一区二区三区| 无码人妻一区二区三区免费| 夜夜揉揉日日人人青青一国产精品 | 青青草原av在线播放| 午夜精品免费| 亚洲国产精品一区在线观看不卡| 欧美人体视频| 国产精品一区二区在线观看 | 国产白丝一区二区三区 | 日韩三级高清在线| 亚洲图片中文字幕| 色播五月激情综合网| 91蜜桃视频在线观看| 亚洲精品国产精华液| 老司机深夜福利网站| 久久久电影一区二区三区| 久久久久亚洲av无码网站| 寂寞少妇一区二区三区| 精品少妇无遮挡毛片| 国产精品日本| 国产原创中文在线观看| 亚洲网站在线| 国产成人艳妇aa视频在线| 国产精品99久久久久久动医院| 日韩影片在线播放| 亚洲图片久久| 欧美国产综合视频| 国产成人一区二区三区影院| 鲁鲁视频www一区二区| 欧美黑人巨大videos精品| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 成人免费看吃奶视频网站| 成人黄色视屏网站| 国产玖玖精品视频| 天堂久久一区| 91免费在线视频网站| 欧美午夜三级| 91网站免费看| 亚洲五码在线| 成人h视频在线观看| 91成人噜噜噜在线播放| 国产伦精品一区二区三区四区视频| www.爱久久| 久久www免费人成精品| 亚洲人成精品久久久| 水蜜桃一区二区| 亚洲va在线| 97超碰国产精品| 在线亚洲一区| 国产av人人夜夜澡人人爽| 精品亚洲porn| 男人添女人荫蒂国产| ww久久中文字幕| 亚洲色成人网站www永久四虎| 国产精品无码永久免费888| 国产极品美女在线| 亚洲午夜三级在线| 色老头一区二区| 欧美久久婷婷综合色| 欧美在线 | 亚洲| 亚洲午夜精品久久久久久性色 | 国产精国产精品| 五月天色综合| 高清视频在线观看一区| 欧美激情极品| 一区二区三区在线视频111| 综合久久精品| 国产免费成人在线| 狠狠色丁香婷婷综合久久片| 中文字幕在线国产| 国产欧美一二三区| 国产精品久久久精品四季影院| 午夜精品福利一区二区蜜股av| 免费精品一区二区| 欧美大片在线观看一区| 久久av少妇| 欧美激情在线观看视频| 澳门av一区二区三区| 97人人模人人爽人人少妇| 尤物tv在线精品| 日韩成人午夜影院| 视频一区二区欧美| 国产一线在线观看| 国产精品久线在线观看| 日韩手机在线观看| 555夜色666亚洲国产免| 牛牛热在线视频| 欧美激情2020午夜免费观看| 国产精品av一区二区三区| 3d精品h动漫啪啪一区二区| 精品一区在线| 久久手机在线视频| 九色|91porny| 国产jjizz一区二区三区视频| 亚洲图片欧美色图| 国产精品国产精品国产专区| 亚洲精品丝袜日韩| h片在线观看视频免费免费| 91久热免费在线视频| 第一社区sis001原创亚洲| 国内外成人激情视频| 丁香六月久久综合狠狠色| 亚洲欧美精品久久| 欧美羞羞免费网站| 九色网友自拍视频手机在线| 久久久久久中文字幕| 电影91久久久| 欧美亚洲视频一区| 日韩成人午夜电影| 男人操女人动态图| 精品美女久久久久久免费| 亚洲精品一区二区三区蜜桃| 日韩亚洲综合在线| 成人黄色视屏网站| 茄子视频成人在线观看| aa亚洲婷婷| 精品国产av色一区二区深夜久久 | 久久久精品免费| 国产成人免费| 亚洲va韩国va欧美va精四季| 久久xxxx精品视频| 性久久久久久久久久| 日韩欧美国产中文字幕| 五月天婷婷视频| 欧美亚洲激情在线| 日韩mv欧美mv国产网站| 水蜜桃色314在线观看| 成人avav影音| 日产亚洲一区二区三区| 亚洲国产免费av| 丰满大乳少妇在线观看网站| 丁香五月网久久综合| 国产精品www994| 日本wwwwwww| 亚洲一区二区五区| 欧美一区二区三区黄片| 午夜欧美不卡精品aaaaa| 欧美电影在线观看免费| 男女高潮又爽又黄又无遮挡| 91在线观看下载| 国产香蕉视频在线| 亚洲精品一区中文字幕乱码| 中文字幕不卡三区视频| 日韩免费一区二区三区| 麻豆freexxxx性91精品| 色老板免费视频| 日韩欧美中文字幕公布| av老司机免费在线| 欧美精品一区二区三区在线四季| 奇米888四色在线精品| 国产91在线播放九色| 日韩欧美国产电影| 日本三级一区| 一区二区日本| 国产成人无遮挡在线视频| 日本一区二区欧美| 亚洲片在线观看| 婷婷成人av| 国产日韩av网站| 国产欧美一区二区在线| 国产日韩欧美一区二区东京热| 欧美精品久久久久久久| 九一国产精品| 欧美激情第一区| 疯狂蹂躏欧美一区二区精品| av在线资源网| 国产二区一区| 日韩高清电影一区| 国产1区2区3区4区| 亚洲男女性事视频| 国产成人免费视频网站视频社区 | 久久国产精品第一页| 久久高清无码视频| 一区二区三区回区在观看免费视频| 国产一区二区三区黄网站| 日韩在线一级片| 亚洲日本青草视频在线怡红院| 涩涩视频免费看| 国产中文欧美精品| 国产精品日韩精品欧美精品| 一区二区三区影视| 亚洲人成在线播放| 亚洲一二三区视频| av免费一区二区| 黑人极品videos精品欧美裸|