查詢背景
有一個表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倍左右,如果是百萬或千萬級別的表,提升差距會更加大,所以有條件還是老老實實用全文索引吧