什么時候考慮將mysql數據遷移到ES?

文章目錄

  • 對ES的一些疑問
    • 問題1:ES相比mysql本身有哪些優勢?
    • 問題2:哪些場景適合用ES而不是mysql?
    • 問題3:mysql逐行掃描,根據過濾條件檢查記錄中對應字段是否滿足要求屬于正排索引,根據二叉樹索引檢索記錄的方式屬于正排索引還是倒排索引
    • 問題4:對于簡單數字字段,為什么不像mysql一樣使用B+樹作為索引
  • 一些概念
    • 1、倒排索引
    • 2、BKD樹

在模糊的影響中,ES查詢效率高,尤其是最近組內在推慢sql治理,看到有些單張表已經存在索引數量近10個,表中字段確實比較多,一種治理方式是寬表拆分多個表,降低每個表查詢的字段,每個表需要創建和維護索引數量也會降低。也在考慮是不是可以將數據同步到ES,部分查詢場景走ES,寬表拆分導致數據比較分散,更新和查詢起來更麻煩,使用ES數據完整性可以保證,相同數據使用不同的存儲介質進行存儲,更新和維護相比來說更簡單。這里不僅自問,增加mysql從庫從庫數量,降低查詢壓力不行嗎,同樣的數據同步到ES查詢,查詢效率就會顯著提升嗎?

對ES的一些疑問

問題1:ES相比mysql本身有哪些優勢?

1、ES會在所有字段上創建索引。
首先對于mysql中的數據同步到ES之后,會以JSON對象的形式進行存儲,mysql中一行記錄對應ES中一個文檔。索引字段都會被索引,對于文本和keyword字段會使用進行分詞、然后采用建立倒排索引,對于數值、日期等其它類型字段使用不同的數據結構和索引技術,例如對于數值和地理位置數據使用BKD樹。

2、水平擴展。
當數據量增加時,可以通過增加結點實現自動水平擴容,而mysql要實現水平擴容,往往需要手動操作,復雜度較大。

3、分布式檢索和并行處理。
ES天然將數據分片存儲,并行查詢時將每個分片上結果合并處理,mysql雖然也支持分庫分表,但分庫分表全部掃描效率相對較慢。

4、ES支持對文本進行全文檢索,比mysql的模糊查詢要快。
例如現在有一個用戶表,其中包含一個個人簡介profile字段,并且該表數據同步一份到了ES,二者要查詢喜歡唱歌的人,查詢方式分別如下,
對于Mysql,使用的是子字符串匹配算法:
SELECT * FROM users WHERE profile LIKE ‘%唱歌%’;
對于ES,使用倒排索引,顯而易見,效率更高:
GET /users/_search
{
“query”: {
“match”: {
“profile”: “唱歌”
}
}
}

問題2:哪些場景適合用ES而不是mysql?

場景mysql效率ES查詢效率優先選擇
簡單數字類型,數量不多高,mysql使用起來更簡單,可視化效果更好高,雖然也支持高效查詢,感覺不是很有必要,相比mysql更重mysql
簡單數字類型,數量很多通過建立索引和分庫分表依然可以勝任,但是維護和查詢復雜度會增高,水平分庫分表可以降低每個表的數據量,垂直分表可以減少單個表字段,提高單表查詢效率,跨表查詢將變得復雜,mysql寫入高,對于實時寫入場景要求高場景可以繼續使用mysql分布式擴展和并行查詢,大數量查詢效率高,并且天然支持水平擴展,寫入效率沒有mysql高,對于做聚合分析效率高,一般也會同步一份數據到ES,負責一些非實時的查詢mysql和ES同時使用
包含大文本低,尤其模糊查詢高,使用了倒排索引ES

問題3:mysql逐行掃描,根據過濾條件檢查記錄中對應字段是否滿足要求屬于正排索引,根據二叉樹索引檢索記錄的方式屬于正排索引還是倒排索引

B+樹非葉子結點存儲記錄中某一列的值,葉子結點存儲記錄的id,倒排索引是根據某個詞查詢出所在的所有文檔列表,二者雖然都是從記錄中某個值查詢整個記錄的信息所在位置(唯一文檔標識或者記錄逐漸),但是二者一個是查詢出一條記錄,一個是查詢出這個單詞出現的所有文檔列表,差別還是很大的,一個用于大文本,一個用戶非大文本,專門解決的場景也不一樣。

問題4:對于簡單數字字段,為什么不像mysql一樣使用B+樹作為索引

首先從ES的定位來說,ES是為了提高多字段聯合查詢,雖然在多個字段上使用B+樹創建聯合索引,但是其實是將多個字段順序化,但其實在相近的數據,在空間上往往距離也很近,對于B+樹沒有保留數據的空間信息,查詢效率不是很高,而是使用使用了保留數據空間特征的BKD-Tree作為索引。
基于B+樹創建的聯合索引。
如下圖所示,創建和查詢都是優先表第一列,只有第一列相同才會比較第二列,這樣多維數據在邏輯上就變成了一維。
在這里插入圖片描述

對于BKD樹,在創建索引,每層會依次按照k個緯度交替輪流進行劃分,這樣不用等第一維值全部檢索完才能利用后面緯度數據進行數據查找,如下圖依次是二維和三維BKD樹的的示意圖,對于二維BKD樹,奇數層次按照第一維度劃分,偶數層次按照第二維進行劃分,依次交替。
在這里插入圖片描述
在這里插入圖片描述

一些概念

1、倒排索引

倒排索引,也成為方向索引,是一種常用在文檔檢索系統中的索引方法,包含兩種形式,第一種,反向文檔索引一條記錄的水平反向索引,包含每個單詞所在文檔列表;第二種,完全反向索引一個單詞的水平反向索引,包含每個單詞在一個文檔中位置。三條記錄,舉例說明,:
T0=“what is banann”
T1= “it is what is it”
T2=“it is a banana”
反向文檔索引:
“a” : {2}
“banana”: {0,2}
“is” :{0,1,2}
“it”:{1,2}
“what”:{0,1}
完全反向索引:
“a” : {(2,2)}
“banana”: {(2,3)}
“is” :{(0,1),(1,1),(1,3),(2,1)}
“it”:{(1,0),(1,4),(2,0)}
“what”:{(0,0),()1,2}
比如查詢條件為“What”, “is”, “it”,計算每個關鍵詞出現的文檔取交集{0,1}∩{0,1,2}∩{1,2}={2},使用完全反向索引同理,只會對文檔位置取交集,例子三條記錄是正向索引,根據文檔id,檢索每個文檔包含的內容。

2、BKD樹

BKD樹全稱為Block-K-dimension Tree,是多維樹(K-dimension Tree,KD-Tree)的改良版本,改善了內存利用率和更好的查詢效率,多用于多維數據搜索。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42328.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot整合DataX數據同步(自動生成job文件)

SpringBoot整合Datax數據同步 文章目錄 SpringBoot整合Datax數據同步1.簡介設計理念 DataX3.0框架設計DataX3.0核心架構核心模塊介紹DataX調度流程 2.DataX3.0插件體系3.數據同步1.編寫job的json文件2.進入bin目錄下,執行文件 4.SpringBoot整合DataX生成Job文件并執…

生產力工具|VS Code安裝及使用指南

一、VS Code介紹 (一)軟件介紹 Visual Studio Code(簡稱VS Code)是由Microsoft開發的免費開源代碼編輯器,適用于Windows、macOS和Linux操作系統。它支持多種編程語言,如JavaScript、Python、C等&#xff0…

知識社區在線提問小程序模板源碼

藍色的知識問答,問答交流,知識社區,在線提問手機app小程序網頁模板。包含:社區主頁、提問、我的、綁定手機,實名認證等。 知識社區在線提問小程序模板源碼

ubuntu 檢查硬盤的通電時長、健康度

ubuntu 檢查硬盤的通電時長、健康度 在Ubuntu系統中,檢查硬盤的通電時長和健康度通常需要使用SMART(Self-Monitoring, Analysis, and Reporting Technology)工具。SMART是硬盤制造商內置的一套硬盤保護技術,用于監控硬盤的健康狀況…

品質至上!中國星坤連接器的發展之道!

在電子連接技術領域,中國星坤以其卓越的創新能力和對品質的不懈追求,贏得了業界的廣泛認可。憑借在高精度連接器設計和制造上的領先地位,星坤不僅獲得了多項實用新型專利,更通過一系列國際質量管理體系認證,彰顯了其產…

【Qt5.12.9】程序無法顯示照片問題(已解決)

問題記錄:Qt5.12.9下無法顯示照片 我的工程名為03_qpainter,照片cd.png存放在工程目錄下的image文件夾中。 /03_qpainter/image/cd.png 因為這是正點原子Linux下Qt書籍中的例程,在通過學習其配套的例程中的項目,發現我的項目少…

【Python】搭建屬于自己 AI 機器人

目錄 前言 1 準備工作 1.1 環境搭建 1.2 獲取 API KEY 2 寫代碼 2.1 引用庫 2.2 創建用戶 2.3 創建對話 2.4 輸出內容 2.5 調試 2.6 全部代碼 2.7 簡短的總結 3 優化代碼 3.1 規范代碼 3.1.1 引用庫 3.1.2 創建提示詞 3.1.3 創建模型 3.1.4 規范輸出&#xf…

在線調試網絡接口的免費網站

免費接口網站 GET接口 https://httpbin.org/get https://httpbin.org/ip https://publicobject.com/helloworld.txt POST接口 https://httpbin.org/post 調試網站 Postman需要下載安裝,還要登錄賬號。對于簡單測試,麻煩! http://coolaf.…

西門子1200高速計數器編碼器的應用 接線 組態 編程 調試 測距測速

編碼器的應用、接線、組態、博途1200編程與調試:高速計數器,用于給PLC發高速脈沖,接I點 用來例如:檢測電機轉速,皮帶輸送機運行的距離 (粗略定位) 360:代表轉一圈會對外發360個脈沖&…

系統化學習 H264視頻編碼(02) I幀 P幀 B幀 引入及相關概念解讀

說明:我們參考黃金圈學習法(什么是黃金圈法則?->模型 黃金圈法則,本文使用:why-what)來學習音H264視頻編碼。本系列文章側重于理解視頻編碼的知識體系和實踐方法,理論方面會更多地講清楚 音視頻中概念的…

Python類實例的json

web開發中有這么一個場景,我們從數據庫中查詢某一數據的時候,往往需要對數據進行一些轉化之后才能傳給前端。 當然我們可以根據查詢出來的實例對象,構建一個dict返回,這樣會導致我們的代碼非常的臃腫。但是這也確實是一種最直接的…

網絡空間測繪是什么?

網絡空間測繪是一種技術過程,用于探測、分析和可視化互聯網及其他網絡環境中的各種資源和連接。這個概念在2016年開始廣泛使用,它涉及到收集有關網絡節點(如服務器、路由器、個人電腦和其他設備)的信息,并建立這些節點…

C++ STL 多線程庫用法介紹

目錄 一:Atomic: 二:Thread 1. 創建線程 2. 小心移動(std::move)線程 3. 如何創建帶參數的線程 4. 線程參數是引用類型時,要小心謹慎。 5. 獲取線程ID 6. jthread 7. 如何在線程中使用中斷 stop_token 三:如何解決數據競爭 1.有問題的代碼 2.使用互斥 3.預防…

Vue3+.NET6前后端分離式管理后臺實戰(二十八)

1,Vue3.NET6前后端分離式管理后臺實戰(二十八)

【Linux進階】文件系統6——理解文件操作

目錄 1.文件的讀取 1.1.目錄 1.2.文件 1.3.目錄樹讀取 1.4.文件系統大小與磁盤讀取性能 2.增添文件 2.1.數據的不一致(Inconsistent)狀態 2.2.日志式文件系統(Journaling filesystem) 3.Linux文件系統的運行 4、文件的刪…

動態規劃算法-以中學排班管理系統為例

1.動態規劃算法介紹 1.算法思路 動態規劃算法通常用于求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應于一個值,我們希望找到具有最優值的解。動態規劃算法與分治法類似,其基本思想也是將待求解問題分解成若…

干貨 | 2024大模型場景下智算平臺的設計與優化實踐(免費下載)

誠摯邀請您微信掃描以下二維碼加入方案驛站知識星球,獲取上萬份PPT/WORD解決方案!!!感謝支持!!!

android pdf框架-11,查看圖片

前10篇文章,9章關于pdf的,pdf解析后,里面也是有各種圖片,于是利用pdf的view來展示圖片,似乎也是個不錯的想法. android手機中的圖片查看功能,有的可以展示,有的不能.比如華為,榮耀對大體積的png是可以顯示的,小米是不顯示,只有縮略圖. 一張png50m大,比如清明上河圖,原圖是tif…

【C++】string的底層原理及實現

文章目錄 string類的存儲結構默認成員函數構造函數析構函數拷貝構造函數賦值重載 容量操作size()capacity()reserve()resize()clear() 遍歷與訪問operator[ ]迭代器范圍與for 增刪查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成員函數op…

c#的List<T>的SelectMany 和Select

在C#中&#xff0c;List<T>&#xff08;以及任何實現了IEnumerable<T>的集合&#xff09;的Select和SelectMany擴展方法都是LINQ&#xff08;Language Integrated Query&#xff09;的一部分&#xff0c;用于對集合中的元素進行查詢和轉換。 盡管它們的作用有些相…