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

架構師必備:多維度查詢的優秀實踐

開發 架構 數據庫
普通的數據庫查詢,很難實現上述需求場景,更不用提模糊查詢、全文檢索了。

背景

有2種常見的多維度查詢場景,分別是:

  • 帶多個篩選條件的列表查詢
  • 不含分庫分表列的其他維度查詢

普通的數據庫查詢,很難實現上述需求場景,更不用提模糊查詢、全文檢索了。

下面結合樓主的經驗和知識,介紹初級方案、進階方案(上ElasticSearch),大部分情況下推薦使用ElasticSearch來實現多維度查詢,趕時間的讀者可以直接跳到“進階方案:將ElasticSearch添加到現有系統中”。

初級方案

1、根據常見查詢場景,增加相應字段的組合索引

這個是為了實現帶多個篩選條件的列表查詢的。

優點

  • 非常簡單
  • 讀寫不一致時間較短:取決于數據庫主從同步延時,一般為毫秒級別

缺點

  • 非常局限:除非篩選條件比較固定,否則難以應付后續新增或修改篩選條件
  • 如果每次來新的篩選查詢字段的需求,就新增索引,最終導致索引過于龐大,影響性能

于是就出現了經典的一幕:產品提需求說要支持某個新字段的篩選查詢,開發反饋說做不了、或者成本很高,于是不了了之 :)

2、異構出多份數據

更加優雅的方式,是異構出多份數據。

例如,C端按用戶維度查詢,B端按店鋪維度查詢,如果還有供應商,按供應商維度查詢。一個數據庫只能按一種維度來分庫。

(1)程序寫入多個數據源

優點是:非常簡單。

缺點

  • 跨庫寫存在一致性問題(除非不同維度的表使用公共的分庫,事務寫入),性能低
  • 不能靈活支持更多其他維度的查詢

(2)借助Canal實現數據的自動同步

通過Canal同步數據,異構出多個維度的數據源。詳見之前寫的這篇文章: 架構師必備:巧用Canal實現異步、解耦的架構

優點是:更加優雅,無需改動程序主流程。

缺點

  • 仍然無法解決不斷變化的需求,不可能為了支持新維度就異構出一份新數據

進階方案:將ElasticSearch添加到現有系統中

應用架構

現有系統一般都會用到MySQL數據庫,需要引入ES,為系統增強多維度查詢的功能。

MySQL繼續承擔業務的實時讀寫請求、事務操作,ES承擔近實時的多維度查詢請求,ES可支撐十萬級別qps(取決于節點數、分片數、副本數)。

需要注意的是:同步數據至ES是秒級延遲(主要耗費在索引refresh),而查詢已進入索引的文檔,是在數毫秒到數百毫秒級別。

導入數據

需要同步機制,來把MySQL中的數據導入到ES中,主要流程如下:

  • 預先定義ES索引的mapping配置,而不依賴ES自動生成mapping
  • 初始全量導入,后續增量導入:Canal+MQ數據管道同步,不需要或僅需少量代碼工作
  • 數據過濾:不導入無需檢索的字段,減小索引大學,提高性能
  • 數據扁平化處理:如果數據庫中有json字段列,需要從中提取業務字段,避免嵌套類型的字段,提高性能

查詢數據

  • 從ES 8.x版本開始,建議使用Java api client,并且要Java 8及以上環境,因為可使用各種lambda函數,來提高代碼可讀性
  • 優點是新客戶端與server代碼完全耦合(相比于原Java transport client,在8.x版本已廢棄),并且API風格與http rest api很接近(相比于原Java rest client,在8.x版本已廢棄),只要熟練掌握http json請求體寫法,即可快速上手。
  • 底層使用的還是原來的low level rest client,實現了http長連接、訪問ES各節點的負載均衡、故障轉移,最底層依賴的是apache http async client。
  • ES 7.x版本及以下,或使用Java 7及以下,建議升級,否則就只能繼續用high level rest client。

代碼示例如下(含詳細注釋):

public class EsClientDemo {

// demo演示:創建client,然后搜索
public void createClientAndSearch() throws Exception {
// 創建底層的low level rest client,連接ES節點的9200端口
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200)).build();

// 創建transport類,傳入底層的low level rest client,和json解析器
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());

// 創建核心client類,后續操作都圍繞此對象
ElasticsearchClient esClient = new ElasticsearchClient(transport);


// 多條件搜索
// fluent API風格,并且使用lambda函數提高代碼可讀性,可以看出Java api client的語法,同http json請求體非常相似
String searchText = "bike";
String brand = "brandNew";
double maxPrice = 1000;

// 根據商品名稱,做match全文檢索查詢
Query byName = MatchQuery.of(m -> m
.field("name")
.query(searchText)
)._toQuery();

// 根據品牌,做term精確查詢
Query byBrand = new Query.Builder()
.term(t -> t
.field("brand")
.value(v -> v.stringValue(brand))
).build();

// 根據價格,做range范圍查詢
Query byMaxPrice = RangeQuery.of(r -> r
.field("price")
.lte(JsonData.of(maxPrice))
)._toQuery();

// 調用核心client,做查詢
SearchResponse<Product> response = esClient.search(s -> s
.index("products") // 指定ES索引
.query(q -> q // 指定查詢DSL
.bool(b -> b // 多條件must組合,必須同時滿足
.must(byName)
.must(byBrand)
.must(byMaxPrice)
)
),
Product.class
);

// 遍歷命中結果
List<Hit<Product>> hits = response.hits().hits();
for (Hit<Product> hit: hits) {
Product product = hit.source(); // 通過source獲取結果
logger.info("Found product " + product.getName() + ", score " + hit.score());
}
}

}

可參閱: ??https://www.elastic.co/guide/en/elasticsearch/client/index.html??

數據模型轉換

因為既有MySQL,又有ES,所以有2種異構的數據模型。需要在代碼中定義2種數據模型,并且實現類型互相轉換的工具類。

  • MySQL數據VO
  • ES數據VO
  • MySQL數據VO、ES數據VO互相轉換工具
  • 業務層BO
  • 接口DTO

原理概要

ES之所以比MySQL,能勝任多維度查詢、全文檢索,是因為底層數據結構不同:

  • ES倒排索引
  • 如果是全文檢索字段:會先分詞,然后生成 term -> document 的倒排索引,查詢時也會把query分詞,然后檢索出相關的文檔。相關度算法如TF-IDF(term frequency–inverse document frequency),取決于:詞在該文檔中出現的頻率(TF,term frequency),越高代表越相關;以及詞在所有文檔中出現的頻率(IDF,inverse document frequency),越高代表越不相關,相當于是一個通用的詞,對相關性影響較小。
  • 如果是精確值字段:則無需分詞,直接把query作為一個整體的term,查詢對應文檔。
  • 因為文檔中的所有字段,都生成了倒排索引,所以能處理多維度組合查詢
  • MySQL B+樹
  • B+樹的非葉子節點記錄了孩子節點值的范圍,而葉子節點記錄了真正的一組值,并且在同一層,形成了一個有序鏈表
  • 組合索引需要顯式創建:選擇需索引的字段、并且順序是重要的,所以如果待查詢的字段不在索引中,就無法高效查詢,可能演變為全表掃描 (對聚簇索引的葉子節點做一次遍歷)

另外簡要回顧一下ES的架構要點:

  • 節點分為主節點、數據節點,一個節點上可以有多個分片,分片分為主分片、副本分片,1對多,主分片與副本分片分布在不同的節點,來實現高可用
  • 主分片數在創建時,就需要指定,在創建后不能隨意更改(如果變化,路由就會出錯);而副本分片可以增加,來提高ES集群的查詢QPS
  • 路由算法:id % 主分片數,如果創建文檔時不指定id,則ES會自動生成;一般會傳自定義業務id

優點、缺點

優點

  • 支持各字段的多維度組合查詢,無懼未來新增字段(主要成本在于新增字段后、重建索引)
  • 與現有系統完全解耦,適合架構演進
  • 在數據量級上遠勝Mysql,最大支持PB級數據的存儲和查詢

缺點

  • 讀寫不一致時間在秒級:因為有2個耗時階段,一是同步階段將數據從MySQL數據庫寫入ES,二是ES索引refresh階段,數據從buffer寫入索引后才可查到
  • 因此一個trick就是,在寫入操作后,前端延遲調用后端的列表查詢接口,比如延遲1秒后再展示
  • 超高并發下存在瓶頸,存在穩定性問題:目前原生版本支持大約 3-5 萬分片,性能已經到達極限,創建索引基本到達 30 秒+ 甚至分鐘級。節點數只能到 500 左右基本是極限了。但依然能滿足絕大部分場景。數據來源: ??https://elasticsearch.cn/slides/259#page=30??

ES最佳實踐

  • 只把需要搜索的數據導入ES,避免索引過大
  • 數據扁平化,不用嵌套結構,提高性能
  • 合理設置字段類型,預先定義mapping配置,而不依賴ES自動生成mapping
  • 精確值的類型指定為keyword(mapping配置),并且使用term查詢
  • 精確值是指無需進行range范圍查詢的字段,既可以是字符串,比如書的作者名字,也可以是數值,比如商品id、訂單id、圖書ISBN編號、枚舉值。在使用中,大部分場景是以id類作為精確值
  • 避免無路由查詢:無路由查詢會并發在多個索引上查詢、歸并排序結果,會使得集群cpu飆升,影響穩定性
  • 避免深度分頁查詢:如有大量數據查詢,推薦用scroll滾動查詢
  • 設置合理的文件系統緩存(filesytem cache)大小,提高性能:因為ES查詢的熱數據在文件系統緩存中
  • ES分片數在創建后不能隨意改動,但是副本數可以隨時增加,來提高最大QPS。如果單個分片壓力過大,需要擴容。

更進一步

前面提到ES超高并發下存在瓶頸,極端情況下可能遇到OOM,因此超高并發下需要C++實現的專用搜索引擎

例如:

  • 百度:通用搜索引擎,根據文字、圖片搜索信息
  • 電商垂類:電商專用搜索引擎,比如根據關鍵詞查找商品,或根據品牌、價格篩選商品,可總結為商品的搜索、廣告、推薦
責任編輯:張燕妮 來源: 博客園
相關推薦

2022-08-29 09:14:01

戰略設計核心域支撐域

2022-05-27 15:19:38

架構師溝通認知

2023-12-01 07:24:40

軟件架構

2015-06-10 11:22:41

云計算云架構師

2015-12-23 10:50:24

運維OPS運維架構師

2019-10-30 16:24:34

分層架構緩存

2012-08-13 16:48:31

架構師

2023-09-27 10:23:19

NoSQL數據模型

2021-10-09 09:52:49

MYSQL開發數據庫

2019-07-16 13:59:43

數據庫MySQL軟件

2021-10-22 08:00:00

架構開發技術

2023-10-07 14:25:14

2020-08-24 08:50:12

架構師TL技術

2013-01-28 14:59:27

2013-06-13 14:29:26

架構師程序員

2018-05-14 09:00:23

NB架構師素質

2009-12-18 10:22:50

Ray Ozzie架構師

2012-08-04 16:02:00

架構師

2024-01-04 09:00:00

SQL數據庫開發

2019-07-03 10:28:24

架構師系統IT
點贊
收藏

51CTO技術棧公眾號

日本午夜一区二区三区| 久久精品国产69国产精品亚洲| 毛片av在线播放| 99视频在线观看免费| 91tv官网精品成人亚洲| 欧美一级片在线| 国产免费裸体视频| 天堂av资源网| 久久综合亚州| 亚洲色图美腿丝袜| 思思久久精品视频| 色老头在线观看| 成人福利在线看| 日本一本a高清免费不卡| 中文字幕在线观看免费高清 | gogo大胆日本视频一区| 欧美一级成年大片在线观看| 在线国产视频一区| 久久69av| 日韩欧美国产免费播放| 色综合久久av| 精品国产无码AV| 亚洲永久视频| 久久视频国产精品免费视频在线| av免费观看不卡| 成人h在线观看| 亚洲精品欧美综合四区| 蜜桃麻豆91| 国产ts变态重口人妖hd| 欧美一级一区| 欧美精品在线网站| 91激情视频在线观看| 日本99精品| 欧美亚洲综合久久| 免费人成在线观看视频播放| 国产免费av高清在线| 国产成人在线看| 国产精品第三页| 国产在线视频卡一卡二| 色婷婷一区二区三区| 日韩电影中文字幕av| 特级丰满少妇一级| 亚洲性色av| 亚洲综合色婷婷| 一本色道久久综合亚洲精品婷婷| 天天干,天天操,天天射| 国产在线麻豆精品观看| 91av视频在线| 免费在线观看国产精品| 91精品1区| 国产亚洲欧美aaaa| 日本黄色特级片| 亚洲无线观看| 91精品国产综合久久婷婷香蕉| 亚洲成熟丰满熟妇高潮xxxxx| 在线观看中文| 综合中文字幕亚洲| 亚洲欧洲精品在线| 懂色av一区二区三区四区| 裸体在线国模精品偷拍| 国产精品久久久久久久9999| 国产精品人人人人| 亚洲日产国产精品| 久久久久国色av免费观看性色 | 精品成人无码久久久久久| 亚洲二区在线| 久久久久久久影院| 人妻少妇精品一区二区三区| 欧美gayvideo| 精品国产一区二区三区久久| 黄色免费一级视频| 欧美色图激情小说| 国产午夜精品全部视频在线播放| 国产全是老熟女太爽了| 国产精品嫩草影院在线看| 日韩精品一区二区视频| 成人精品在线观看视频| 久久悠悠精品综合网| 91麻豆精品国产自产在线观看一区| 男人天堂成人在线| 成人看片在线观看| 精品视频123区在线观看| 欧美性猛交xxx乱久交| 性欧美videohd高精| 色婷婷av一区二区三区软件| 50路60路老熟妇啪啪| 黄色成人免费网| 日本韩国视频一区二区| 久久精品视频91| 国产69精品久久| 欧美日本一区二区在线观看| 在线观看日本www| 一区二区三区四区视频免费观看| 欧美精品九九99久久| 黑人无套内谢中国美女| 乱亲女h秽乱长久久久| 精品视频久久久| 老熟妇一区二区| 日韩在线观看电影完整版高清免费悬疑悬疑| 在线日韩中文字幕| 五月婷婷一区二区| 国产精品亚洲综合久久| 国产精品久久久久久影视 | 亚洲激情图片qvod| 国产爆乳无码一区二区麻豆| av蜜臀在线| 91精品1区2区| 少妇丰满尤物大尺度写真| 卡通动漫精品一区二区三区| 国产香蕉97碰碰久久人人| 久久久久久成人网| 欧美日韩亚洲一区三区| 欧美孕妇与黑人孕交| 这里只有精品国产| 成人午夜碰碰视频| 偷拍视频一区二区| 韩国日本一区| 91黄色小视频| 国产高潮失禁喷水爽到抽搐| 精品久久网站| 欧美精品videosex性欧美| 国产熟妇一区二区三区四区| 国产一区二区在线电影| 六十路精品视频| 国产不卡在线| 欧美在线|欧美| 少妇被狂c下部羞羞漫画| 日韩精品欧美激情一区二区| 久久久久日韩精品久久久男男| 99久久久久久久久| 精品一区二区日韩| 欧美精品一区二区三区在线四季 | 色之综合天天综合色天天棕色| 污污的网站在线看| 欧美性videosxxxxx| 久久久高清视频| 99热国内精品| 青青在线视频一区二区三区| 性生活视频软件| 国产精品午夜在线观看| 尤物av无码色av无码| 国产国产一区| 亚洲香蕉伊综合在人在线视看| 精品人妻在线播放| 国产一区二区毛片| 亚洲成人一区二区三区| 欧美大电影免费观看| 亚洲第一免费播放区| 成人免费毛片xxx| 美女一区二区三区在线观看| 欧洲高清一区二区| 成人一区福利| 亚洲精品国产电影| 日本少妇裸体做爰| 国产成人亚洲精品青草天美| 中文字幕剧情在线观看一区| 91在线亚洲| 亚洲天堂男人天堂| 亚洲国产av一区二区三区| 风流少妇一区二区| 国产a级黄色大片| 精品一区二区三区免费看| 久久精品精品电影网| 成人h动漫精品一区二区下载| av高清不卡在线| 东北少妇不带套对白| 99a精品视频在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品一级二级| 亚洲欧美福利一区二区| 视频区 图片区 小说区| 亚洲免费二区| 97超级碰碰| 美女精品导航| 日韩大陆毛片av| 日本三级免费看| fc2成人免费人成在线观看播放| 亚洲 自拍 另类小说综合图区| 国产精品黄网站| 欧美性受xxxx黑人猛交| 久草在现在线| 欧美视频在线一区| 欧美风情第一页| 国产成人精品午夜视频免费| 精品少妇人欧美激情在线观看| 国内精品麻豆美女在线播放视频 | 日本激情视频一区二区三区| 久久精品理论片| 亚洲AV无码成人精品一区| 国产剧情一区二区在线观看| 欧美黑人性生活视频| 婷婷在线免费观看| 福利一区福利二区微拍刺激| 色无极影院亚洲| 美女网站视频久久| 国产日韩欧美大片| 欧美日韩一本| 国产精品久久久久久五月尺| 2021国产在线| 欧美精品一区二区三区一线天视频 | 国产精品香蕉一区二区三区| 国产精品入口芒果| 国产精品一区二区av交换| 国产精品嫩草视频| 激情影院在线| 亚洲日本欧美日韩高观看| 国产精品久久久久久69| 亚洲自拍偷拍欧美| www.av欧美| 国产一区二区电影| 欧美日韩国产精品激情在线播放| 成人在线免费观看网站| dy888夜精品国产专区| 欧美日韩大片| 欧美国产欧美亚洲国产日韩mv天天看完整| 深夜福利在线观看直播| 欧美视频日韩视频在线观看| 少妇影院在线观看| 国产女主播视频一区二区| 国产探花在线观看视频| 香蕉成人久久| www.国产在线播放| 日韩精品免费一区二区在线观看 | 一本色道久久综合狠狠躁篇的优点| 99久久夜色精品国产亚洲| 欧美性xxxxx| 91aaa在线观看| 国产欧美日韩另类一区| av av在线| 国产精品资源在线看| 九热视频在线观看| 国产亚洲毛片| 国产精品av免费观看| 成人久久久久| av噜噜色噜噜久久| 亚洲福利影视| 国产精品第三页| 日韩伦理在线一区| 色综合色综合久久综合频道88| 国产鲁鲁视频在线观看免费| 亚洲国产欧美一区| 精品毛片一区二区三区| 欧美视频在线一区| 日韩欧美不卡视频| 亚洲一区二区三区影院| 久久99久久98精品免观看软件| 亚洲色图在线视频| 人妻人人澡人人添人人爽| 亚洲人成精品久久久久| 国产稀缺精品盗摄盗拍| 亚洲精品视频免费观看| 国产亚洲精品成人| 亚洲成av人片一区二区三区| 国产亚洲精品久久777777| 亚洲大片免费看| 国产成人亚洲精品自产在线 | 日本欧美www| 精品视频123区在线观看| 91久久精品无码一区二区| 51精品久久久久久久蜜臀| 精品免费久久久| 亚洲国产精品中文| 免费在线性爱视频| 中文字幕久精品免费视频| 一本一道波多野毛片中文在线| 日韩中文字幕在线视频播放| caopo在线| 97视频在线观看亚洲| 亚洲1234区| 91精品综合视频| 97久久超碰| 欧美人xxxxx| 色综合久久一区二区三区| 精品国产一区二区三区在线| 伊人天天综合| 中文字幕在线导航| 国产在线不卡视频| 一本色道综合久久欧美日韩精品| 国产欧美日韩视频在线观看| 国产尤物在线播放| 婷婷开心激情综合| 国产精品自拍第一页| 91精品国产一区二区三区香蕉| 好男人在线视频www| 亚洲人成在线一二| www在线免费观看视频| 456国产精品| vam成人资源在线观看| 精品在线不卡| 婷婷亚洲五月| 国产91在线视频观看| 国产综合色精品一区二区三区| 成熟妇人a片免费看网站| 中文字幕精品一区二区三区精品 | 欧美日韩99| 日本一区二区黄色| 国产精品99久| 国产免费一区二区三区网站免费| 日韩美女精品在线| 黄色一级片免费在线观看| 在线观看91精品国产麻豆| 日韩porn| 欧美国产精品va在线观看| 福利视频亚洲| 欧美日韩在线精品| 国内综合精品午夜久久资源| 99sesese| 久久亚洲二区三区| 免费无码毛片一区二区app| 欧美伊人久久久久久午夜久久久久| 色网站免费观看| 久久久精品免费| 日本欧美一区| 精品999在线观看| 欧美 亚欧 日韩视频在线| 亚洲人辣妹窥探嘘嘘| 99精品视频免费在线观看| 欧美精品久久久久久久久46p| 91精品1区2区| 亚洲 精品 综合 精品 自拍| 欧美精品在线看| 国产成人免费视频网站视频社区| 日本视频一区二区不卡| 国产欧美午夜| 欧亚乱熟女一区二区在线| 亚洲欧美偷拍三级| 91久久久久国产一区二区| 国产一区二区三区精品久久久 | 日批免费观看视频| 亚洲另类一区二区| 国产在成人精品线拍偷自揄拍| 国产一区二区三区免费视频| 不卡av播放| 免费在线成人av电影| 99热精品在线观看| 亚洲啪av永久无码精品放毛片| 亚洲精品视频在线观看网站| av网站在线观看免费| www.99久久热国产日韩欧美.com| 国产福利亚洲| 中文字幕久久综合| 国产综合成人久久大片91| 三级全黄做爰视频| 91精品国产一区二区三区香蕉| 国产激情视频在线| 97超级碰碰| 亚洲伦伦在线| 中国av免费看| 日韩欧美亚洲成人| 精品久久久久一区二区三区| 国产v综合ⅴ日韩v欧美大片| 精品一区在线| 成人免费视频久久| 欧美国产欧美综合| 亚洲自拍偷拍另类| 久久影视免费观看| 97视频一区| 日韩黄色片视频| 国产人久久人人人人爽| 懂色av蜜臀av粉嫩av喷吹| 综合av色偷偷网| 99久久99九九99九九九| 人妻互换免费中文字幕| av在线不卡电影| 无码人妻精品一区二| 最近2019中文字幕大全第二页 | 欧美妇女性影城| 亚洲区欧洲区| 国产日韩一区欧美| 日本午夜一区二区| 国产高清视频免费在线观看| 日韩一区二区三区电影在线观看 | 97精品人妻一区二区三区蜜桃| 精品露脸国产偷人在视频| 国产在线91| 114国产精品久久免费观看| 最新日韩欧美| 男人的天堂av网| 91麻豆精品国产91久久久久久 | 国产精品专区h在线观看| 女主播福利一区| 强伦人妻一区二区三区| 88在线观看91蜜桃国自产| 超碰97免费在线| 五月天国产一区| 国产成人精品网址| 超碰在线观看91| 欧美日韩国产成人高清视频| 香蕉久久精品日日躁夜夜躁| 亚洲精品久久久久久宅男| 亚洲成人av资源| 日韩免费网站| 精品视频导航| 久久草av在线| 日韩精品视频免费播放| 日韩在线精品一区| 亚洲国产国产| av影片在线播放| 欧美亚洲一区二区在线| 国产精品蜜臀|