1. 程式人生 > 其它 >mysql百萬級資料表like模糊查詢優化方案

mysql百萬級資料表like模糊查詢優化方案

本文的測試是基於740w條測試資料進行的,只討論like模糊查詢的優化方案。其他SQL優化可參考:
SQL優化的幾種方式

查詢開頭是“今天不開心”的聊天記錄,是可以走索引的。

select * from message_1 where content like "今天不開心%”;

查詢包含“今天不開心”的聊天記錄,是不能走索引的。

select * from message_1 where content like "%今天不開心%";

  

咱們主要優化的是第二種情況,我本人測試查詢耗時是在9秒。

優化方案

對於查詢包含某個關鍵詞的需求,從業務上來說應儘量避免這種不合理的需求。

但是實際使用中,總有些類似需求避免不掉模糊查詢,就可以採取下列優化方式。

  • 稍微優化
select * from message_1 where instr(content, "今天不開心") > 0;
select  * from message_1 where locate("今天不開心", content) > 0;

這個方法優化效果有限,這兩種方法耗時相差不多,比不優化要快上2~3秒。

我還測試了一些其他的一些情況,這種優化方式,在某些情況下會比優化前還要慢,由此可見這種方式是有坑的

比如優化前:

select content from message_1 where content like "%今天不開心%";

優化後:

select content from message_1 where instr(content, "今天不開心") > 0;

select content from message_1 where locate(
"今天不開心", content) > 0;

這種情況,優化後比不優化要慢上2秒左右。。。。

  • 大幅度優化
select * from message_1 where content in 
(select content from message_1 where content like "%今天不開心%");

這種方法,能將查詢優化至3秒左右,優化效果已經很明顯。

優化原理:用索引全掃描取代表的全掃描。因為索引全掃描的代價是全表掃描的1/N (即索引塊數與資料塊數的比例),表資料越多,優化效果越明顯。

優化後的sql語句,根據索引再回表的代價要看符合條件的記錄數多少:如果in子查詢返回的記錄數很少,那麼優化的效果就相當於效率提高了N倍;如果in子查詢返回的記錄數較多,兩種SQL的效能區別就不是很明顯了。

根本優化
使用ClickHouse 或者 Elasticsearch 同步資料庫。

這兩種方式可以從根本上解決模糊查詢的高延時,但是需要引入一套新的系統,代價還是不小的。

二者的對比可參考:
Elasticsearch和Clickhouse基本查詢對比
ClickHouse 與es比較
————————————————
版權宣告:本文為CSDN博主「終成一個大象」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/Martin_chen2/article/details/121407417