MySQL全文索引、聯合索引、like查詢、json查詢速度大比拼

2020-12-05 計算機java編程

查詢背景

有一個表tmp_test_course大概有10萬條記錄,然後有個json欄位叫outline,存了一對多關係(保存了多個編碼,例如jy1577683381775)

我們需要在這10萬條數據中檢索特定類型的數據,目標總數據量:2931條

SELECTCOUNT(*) FROM tmp_test_course WHERE`type`=5AND del=2AND is_leaf=1

我們在限定為上面類型的同時,還得包含下面任意一個編碼(也就是OR查詢)

下面分別列出4種方式查詢outline欄位,給出相應的查詢時間和掃描行數

一、like查詢

耗時248毫秒

EXPLAIN分析結果如下,全表掃描

二、json函數查詢

json官方函數

耗時196毫秒,速度稍微快了一點

EXPLAIN分析結果如下,還是全表掃描

三、聯合索引查詢

下面為該表建立一個聯合索引(本來想建一個type-del-is_leaf_outline的索引,但是outline欄位太長限制,所以只加type-del-is_leaf_的聯合索引

ALTERTABLE tmp_test_course ADDKEY`type-del-is_leaf` (`type`,`del`,`is_leaf`)

加入索引後再執行like和json查詢,明顯提速。

like執行用了136毫秒,json查詢用了82.6毫秒,由此可見json查詢比like快

EXPLAIN分析結果如下,兩者查詢掃描的行數都限定在了2931行

四、全文索引查詢

因為全文索引只支持CHAR、VARCHAR和TEXT,我們需要把JSON欄位定義改一下

ALTERTABLE tmp_test_course MODIFY`outline`VARCHAR(1024) NOTNULLDEFAULT'[]'

添加全文索引

ALTERTABLE tmp_test_course ADD FULLTEXT INDEXoutline (outline);

現在再來用全文索引進行檢索

耗時11.6毫秒,速度提升極其明顯,可見全文索引的牛逼。

EXPLAIN分析結果如下,顯示只掃描了一行

結論

以下是4種情況的執行結果

全文索引: 11.6ms聯合索引:82.6ms(json)、136ms(like)json函數查詢:196mslike查詢: 248ms

結論:全文索引 > 聯合索引 > json函數查詢 > like查詢數據量越大,全文索引速度越明顯,就10萬的量,查詢速度大概比直接查詢快了20倍左右,如果是百萬或千萬級別的表,提升差距會更加大,所以有條件還是老老實實用全文索引吧

相關焦點

  • mysql 版本號解釋_mysql workbench查詢mysql版本號 - CSDN
    最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
  • MySQL InnoDB 索引原理
    頁(page)頁是InnoDB存儲引擎的最小管理單位,每頁大小默認是16KB,從InnoDB 1.2.x版本開始,可以利用innodb_page_size來改變頁size,但是改變只能在初始化InnoDB實例前進行修改,之後便無法進行修改,除非mysqldump導出創建新庫,常見的頁類型有:數據頁、undo頁、系統頁、事務數據頁、插入緩衝位圖頁、插入緩衝空閒列表頁、未壓縮的二進位大對象頁
  • 圖解MySQL索引——B-Tree(B+Tree)
    索引非常關鍵,尤其是當表中的數據量越來越大時,索引對於性能的影響愈發重要。索引能夠輕易將查詢性能提高好幾個數量級,總的來說就是可以明顯的提高查詢效率。三、索引的分類?1、從存儲結構上來劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。
  • 月薪3W,面試官問:詳細聊聊MySQL中 聚簇、非聚簇索引和覆蓋索引
    如果把這張錶轉換成平衡樹結構(一棵非常茂盛和節點非常多的樹),假設這棵樹有10層,那麼只需要10次IO開銷就能查找到所需要的數據, 速度以指數級別提升,用大O標記法就是O(log n),n是記錄總樹,底數是樹的分叉數,結果就是樹的層次數。換言之,查找次數是以樹的分叉數為底,記錄總數的對數。
  • 從原理到優化,深入淺出資料庫索引 - 計算機java編程
    MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構。資料庫查詢是資料庫的最主要功能之一,我們都希望查詢數據的速度能儘可能的快,因此資料庫系統的設計者會從查詢算法的角度進行優化,這篇文章對索引做一個系統的梳理,希望對大家有幫助。
  • 一文看懂聚集索引和非聚集索引的區別
    這就使讓ID號這個主鍵作為聚集索引成為一種資源浪費。其次,讓每個ID號都不同的欄位作為聚集索引也不符合「大數目的不同值情況下不應建立聚合索引」規則;當然,這種情況只是針對用戶經常修改記錄內容,特別是索引項的時候會負作用,但對於查詢速度並沒有影響。
  • 一條查詢SQL在MySQL中是怎麼執行的
    一般連接命令是這樣寫的:mysql -h$ip -P$port -u$user -p輸入命令之後,就需要在交互對話中輸入密碼,密碼也可以直接寫在-p後面,但是這種操作一般是開發過程中,連接生產伺服器不建議這樣做,因為可能會導緻密碼洩露。
  • MySQL的索引結構為什麼使用B+樹?
    hash等其他索引)。更適於範圍查詢:在B樹中進行範圍查詢時,首先找到要查找的下限,然後對B樹進行中序遍歷,直到找到查找的上限;而B+樹的範圍查詢,只需要對鍊表進行遍歷即可。更穩定的查詢效率:B樹的查詢時間複雜度在1到樹高之間(分別對應記錄在根節點和葉節點),而B+樹的查詢複雜度則穩定為樹高,因為所有數據都在葉節點。
  • 為什麼 MongoDB 索引選擇B樹,而 Mysql 索引選擇B+樹?
    針對我們這個問題的最核心的特點如下:(1)多路,非二叉樹(2)每個節點既保存索引,又保存數據(3)搜索時相當於二分查找其他的基本上都是一些常見的數據結構,假定都已經了解了B樹相關的結構。3、從區別找特點第一:查找元素(1)B樹的數據保存在所有節點,查詢複雜度最好是 O(1)。(2)B+樹的數據保存在葉子節點,查詢時間複雜度固定是O(log(n))第二:區間查找(1)B樹每個節點 key 和 data 在一起,則無法區間查找。
  • MySQL 8.0 正式版 8.0.11 發布:比 MySQL 5.7 快 2 倍
    性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來了更好的性能:讀/寫工作負載、IO 密集型工作負載、以及高競爭("hot spot"熱點競爭問題)工作負載。
  • MySQL 8.0 正式版 8.0.11 發布:比 MySQL 5.7 快 2 倍 - OS...
    性能:MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來了更好的性能:讀/寫工作負載、IO 密集型工作負載、以及高競爭("hot spot"熱點競爭問題)工作負載。
  • 何索引數以十億計的文本向量?
    索引數十億查詢面臨的挑戰我們假設目標是索引 40 億個 200 維的查詢向量,其中每一維由一個 4 字節的浮點數表示。一個粗略的計算告訴我們,向量的大小大約是 3TB。由於許多現有的 ANN 庫都是基於內存的,這意味著我們需要一個非常大的伺服器來將向量放入 RAM 中。注意,這個大小不包括大多數方法中需要的額外搜索索引。
  • (Mysql優化系列3)
    4個元素圖當每個大節點超過節點容量時發生轉換。最終結果圖如下相比較紅黑樹他的高度只有2,查詢速度更快。B-樹因此具有以下幾個特點:1)、葉節點具有相同的深度,葉節點的指針為空2)、所有索引元素不重複3)、節點中的數據索引從左到右遞增排列看完數據結構,我們看B樹做索引的結構又如何呢,mysql默認索引節點為16KB,當然可以修改大小。
  • Python爬取100G級別,2000K以上數據量,用mysql還是mongodb?
    通常來說,千萬條以上的數據,mysql資料庫的性能會有明顯下降,當然可以通過配置主從,或者使用中間件來提高性能。對於mongoDB來說,100G,2000W的數據量應該算是正常,管理上會比mysql簡單。但是如果需要較強的事務性、一致性等,mongo可能就不能滿足要求。
  • 京東面試:說說MySQL的架構體系
    對於更新壓力大的資料庫來說,查詢緩存的命中率會非常低。除非你的業務就是有一張靜態表,很長時間才會更新一次。比如:一個系統配置表,那這張表上的查詢才適合使用查詢緩存。好在MySQL也提供了這種「按需使用」的方式。你可以將參數query_cache_type設置成DEMAND,這樣對於默認的SQL語句都不使用查詢緩存。
  • Elasticsearch開始的第一步索引index
    所以,坐下來,開始以旋風般的速度來感受Elasticsearch的能力吧!讓我們建立一個員工目錄假設我們剛好在Megacorp工作,這時人力資源部門出於某種目的需要讓我們創建一個員工目錄,這個目錄用於促進人文關懷和用於實時協同工作,所以它有以下不同的需求:數據能夠包含多個值的標籤、數字和純文本。檢索任何員工的所有信息。
  • 如何破解HIT的孤島效應,一起關於患者主索引的案例分享
    十八年前的病歷,還是份死亡病歷,看來今天這事確實有點麻煩,事主已經去病案室查詢過,沒有找到就說明,按照正常的患者姓名、身份證號是查詢不到這份病歷的。2002年我們已經實施了住院登記系統,患者入院時是需要填寫詳細基本信息的,也許通過其他信息可以查到。於是我開啟了偵探模式。
  • MySQL存儲引擎的物理結構與表空間
    最初始時只要是個innodb引擎的表,都需要將數據行,索引,元信息和undo信息都存入到共享表空間,共享表空間再以不可見的形式存入到各大磁碟下,全都存入了ibdata1中。這樣做的好處是可以實現類似Oracle的表空間管理模式,做一些擴容。