
文章插圖
前言前兩周寫過一篇《基于Lucene查詢原理分析Elasticsearch的性能》,在最后留了一個彩蛋,說下一篇會介紹一種可以極大的優(yōu)化查詢性能的技術 。本文就來介紹這種技術——IndexSorting 。
因為IndexSorting是在ES6.0之后才作為實驗性的功能加入,相關的介紹資料還比較少,所以大部分人對它不夠了解 。另一方面是,想要理解它為什么能夠優(yōu)化性能、適合哪些場景、內部如何實現(xiàn)、有何副作用等,也需要花一翻功夫 。所以本文專門對IndexSorting進行一個介紹,并分析它的作用、實現(xiàn)、適用場景等 。如果你的場景能用上IndexSorting,那么它肯定會給你帶來一個巨大的性能提升!
什么是IndexSorting?IndexSorting是ES的新功能
在Elasticsearch中,IndexSorting是一個很新的功能,6.0版本才引入,并且標記這個功能是Beta版(6.5版本可能會去掉Beta標記) 。
在Lucene中,IndexSorting其實已經發(fā)展了一段時間 。最早在10年,Lucene提供了一個IndexSorter的工具,作為一個離線工具可以對Index數(shù)據排序后生成一個新的Index 。后來13年加入了SortingMergePolicy,在Segment進行merge的時候可以生成排好序的新Segment,在17年又加入了Sorting on flushed segment的功能,在Segment最初生成時就進行排序 。另一方面是Lucene在查詢時也做了很多優(yōu)化,如果有IndexSorting,很多地方做了提前中斷,后面會講提前中斷對查詢性能的巨大作用 。經過幾次Lucene的改進和優(yōu)化,IndexSorting這個功能也終于被集成進Elasticsearch 。
IndexSorting是一種預排序
與查詢時的Sort不同,IndexSorting是一種預排序,即數(shù)據預先按照某種方式進行排序,它是Index的一個設置,不可更改 。大家知道,Elasticsearch的底層是Lucene,Lucene中是以Segment為單位進行查詢的,這里說的IndexSorting對數(shù)據進行預排序也是在每個Segment內有序的 。
一個Segment中的每個文檔,都會被分配一個docID,docID從0開始,順序分配 。在沒有IndexSorting時,docID是按照文檔寫入的順序進行分配的,在設置了IndexSorting之后,docID的順序就與IndexSorting的順序一致 。
舉個例子來說,假如文檔中有一列為Timestamp,我們在IndexSorting中設置按照Timestamp逆序排序,那么在一個Segment內,docID越小,對應的文檔的Timestamp越大,即按照Timestamp從大到小的順序分配docID 。
為什么IndexSorting可以優(yōu)化性能?
提前中斷
IndexSorting能夠優(yōu)化性能,主要就是靠四個字,“提前中斷” 。但是提前中斷是有條件的,需要查詢的Sort順序與IndexSorting的順序相同,并且不需要獲取符合條件的記錄總數(shù)(TotalHits) 。
Lucene中的倒排鏈都是按照docID從小到大的順序排列的,在進行組合條件查詢時,也是按照docID從小到大的順序選出符合條件的doc 。那么當查詢時的Sort順序與IndexSorting的順序相同時,會發(fā)生什么呢?
比如查詢時希望按照Timestamp降序排序后返回100條結果,在Lucene中進行查詢時,發(fā)現(xiàn)docID對應的doc順序也剛好是Timestamp降序排序的,那么查詢到前100個符合條件的結果即可返回,這100個一定也是Timestamp最大的100個,這就做到了提前中斷 。
提前中斷可以極大的提升查詢性能,特別是當一個查詢條件命中的文檔數(shù)量非常多的時候 。在沒有IndexSorting時,必須把所有符合條件的文檔的docID掃描一遍,并且讀取這些doc的一些字段來排序,選出符合條件的doc 。有了IndexSorting之后,只需要選出前Top個doc即可,避免了全部掃描,性能甚至可以提升幾個數(shù)量級 。
IndexSorting提高了數(shù)據壓縮率
Lucene中使用了很多的壓縮算法來對數(shù)據進行壓縮,壓縮一方面減少了磁盤使用量,另一方面也減少了查詢時讀取磁盤的數(shù)據量和IO次數(shù)等,對查詢性能有很大幫助 。
以上關于本文的內容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!
「愛刨根生活網」www.malaban59.cn小編還為您精選了以下內容,希望對您有所幫助:- 肚皮舞教程 動作指導
- 肚皮舞教程的入門動作
- 閑魚無貨源你必須搞懂的5個問題 閑魚無貨源賺錢詳細教程
- 阿里云建網站詳細步驟 阿里云建站詳細教程
- imac一體機重裝系統(tǒng) imac裝win7詳細教程
- 路由器頻段帶寬設置方法教程 頻段帶寬
- 開菜鳥驛站需要哪些前提條件 無經驗的人可以開菜鳥驛站嗎
- ps圖片轉矢量圖教程 如何做矢量圖海報
- QQ永久凍結解封方法技巧教程 免費強制解凍qq網站
- Excel文件轉Dat文件教程 dat是什么文件
