Elasticsearch 最佳化查詢中獲取欄位內容的方式,效能提升5倍!
來源:銘毅天下Elasticsearch
1、背景
叢集配置為:8 個 node 節點,16 核 32G,索引 4 分片 1 副本。應用程式的查詢邏輯是按經緯度排序後找前 200 條文件。
1、應用對查詢要求比較高,search 沒有慢查詢的狀態。
2、叢集壓測效能不能上去,cpu 使用未打滿,查詢的 qps 上不去,且有佇列堆積。
2、最佳化方法
透過雲廠商核心組的同學抓取火焰圖發現,主要消耗在 fetch phrase 階段。
ES 預設從_source 取,每次查詢都會讀取一行資料,並需要做解壓,如果對查詢耗時要求比較高,應當在查詢時關閉 store fields ,查詢語句 指定“stored_fields”: [“none”], 砍掉後設資料欄位,同時用 “docvalue_fields”: [“video_fact_id”], 指定只拉取需要的欄位,降低序列化跟網路傳輸開銷。約能提升40% 效能。
推薦DSL如下:
GET /your_index/_search
{
"query": {
"match_all": {} // 或者是其他符合你需求的查詢
},
"stored_fields": ["none"], // 不獲取任何儲存的欄位
"docvalue_fields": ["field1", "field2"] // 只獲取需要的doc value欄位
}
3、最佳化後效率
3.1 查詢耗時有進一步的提升
3.2 壓測時cpu使用率和qps也有了明顯的上升
壓測最終的指標:最佳化前1800qps,最佳化後9200qps。
4、最佳化根因分析
在最佳化前,由於Elasticsearch預設從_source欄位讀取資料,這導致每次查詢都需要讀取整行資料並進行解壓。這個過程不僅耗費CPU資源,還會增加響應時間,特別是當文件內容龐大時。
解壓操作是CPU密集型的,而在高負載情況下,這可能成為系統瓶頸,從而限制了查詢效能和吞吐量。
最佳化後,透過指定“stored_fields": ["none"],我們有效地排除了_source欄位的讀取和解壓過程,這顯著減少了每個查詢的CPU負載。
而使用“docvalue_fields”指定從列存中獲取欄位內容,沒有壓縮的轉換,進一步減少了資料處理的開銷。這種方法不僅降低了CPU的使用率,同時只提取必要的欄位也減少了了網路傳輸的負擔。
最終,透過這些最佳化措施,查詢的QPS(每秒查詢數)得到了顯著提升,從1800qps提高到9200qps,這在高效能應用場景中是一個巨大的飛躍。
更高的QPS意味著系統能夠更快地處理更多的查詢請求,提高了整體的吞吐量和效能。
5、小結
總結來說,透過精細地調整查詢策略和減少不必要的資料處理,我們可以顯著提升Elasticsearch的效能,這在處理大規模資料和高併發查詢的環境下尤為重要。
6、官方文件
5、作者介紹
金多安,Elastic 認證專家,Elastic資深運維工程師,死磕Elasticsearch知識星球嘉賓,星球Top活躍技術專家,搜尋客社群日報責任編輯
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2998733/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Elasticsearch 單字串多欄位查詢Elasticsearch字串
- MongoDB查詢如何只輸出部分欄位內容MongoDB
- Elasticsearch 複合查詢——多字串多欄位查詢Elasticsearch字串
- uniapp獲取通知欄內容 監聽通知欄內容APP
- Laravel 查詢資料庫欄位內容是 Json 陣列時的查詢語句Laravel資料庫JSON陣列
- [Elasticsearch] 多欄位搜尋 (二) - 最佳欄位查詢及其調優(轉)Elasticsearch
- mysql查詢欄位內容無法區分大小寫問題MySql
- 在 with 查詢中只查詢個別欄位
- Spark SQL解析查詢parquet格式Hive表獲取分割槽欄位和查詢條件SparkSQLHive
- javascript 獲取iframe中內容JavaScript
- 如何在Clob欄位中查詢
- clob 欄位查詢
- Elasticsearch 查詢in 和 not in 的實現方式Elasticsearch
- [Mysql 查詢語句]——查詢欄位MySql
- 獲取request中的查詢引數
- Mysql 的編碼方式使得欄位內容不區分大小寫MySql
- Elasticsearch中的Term查詢和全文查詢Elasticsearch
- 如何獲取java類中的欄位修飾符?Java
- PHP獲取目錄中的全部內容RecursiveDirectoryIteratorPHP
- Django框架:8、聚合查詢、分組查詢、F與Q查詢、ORM查詢最佳化、ORM事務操作、ORM常用欄位型別、ORM常用欄位引數Django框架ORM型別
- ElasticSearch中的簡單查詢Elasticsearch
- lucene 多欄位查詢-MultiFieldQueryParser
- Laravel ORM 中,根據關聯查詢的欄位值,對主查詢排名LaravelORM
- 獲取SqlServer 2005中欄位的備註資訊SQLServer
- SQL2005查詢表中欄位的描述SQL
- 查詢某個欄位的不同值
- MySQL查詢效能最佳化MySql
- elasticsearch 特殊欄位Elasticsearch
- ElasticSearch多層nested查詢、nested過濾排除非結果內容Elasticsearch
- 提升50%!Presto如何提升Hudi表查詢效能?REST
- 基於Lucene查詢原理分析Elasticsearch的效能Elasticsearch
- fastadmin中快速搜尋時執行查詢的欄位 預設查詢idAST
- 如何在MySQL中實現替換欄位部分內容MySql
- ArcGIS對欄位分割查詢操作
- Oracle 查詢欄位詳細資訊Oracle
- 查詢oracle欄位預設值Oracle
- 自己封裝的公共獲取資料的方法(支援按欄位名查詢,時間查詢,分頁,關聯查詢),只需一行程式碼封裝行程
- [備查]使用 SPQuery 查詢 "Person or Group" 欄位