mysql like效能優化

2021-09-01 13:26:01 字數 1746 閱讀 7348

網上很多優化like的方法,無非下面幾種,抄來抄去的。

我用213萬條資料,每條資料50個字段左右(用的真實的生產環境的mysql資料庫,和真實的生產環境的資料),做了效能測試;時間記錄的次數不多,但是基本都做了10次左右,時間誤差不大的,就只記錄了3次,結果如下:

結論:1.locate,instr,regexp三個函式,效果在like面前沒有任何優勢。(那些說有明顯優勢的,難道是用遠超213萬條資料測試出來的?)

2.效果好壞,取決於能不能用上索引。

3.like,如果要用,那用左匹配,效果是最好的,因為可以用上索引,其他的方式,索引會失效的,速度自然很低。

4.並沒有發現什麼有效的優化方式。

5.搜尋業務,資料量大,不如直接用專業的搜尋引擎,比如es之類的。

-- 6015ms   5996ms  6008ms  不用索引

select * from `ent_file` where `ent_name` like concat('%','奧的斯','%');

explain select * from `ent_file` where `ent_name` like concat('%','飛鳴','%');

-- 5975ms 6037ms 5987ms 不用索引

explain select * from `ent_file` where `ent_name` like concat('%','****');

-- 2ms 2ms 用索引

select * from `ent_file` where `ent_name` like concat('杭州飛鳴','%');

-- 2ms 2ms 用索引

explain select * from `ent_file` where `ent_name` like concat('浙江君時','%');

-- 6265ms 6209ms 不用索引

select * from `ent_file` a where locate('杭州飛鳴',a.`ent_name` ) > 0;

-- 6289ms 6234ms 不用索引

explain select * from `ent_file` a where locate('奧的斯',a.`ent_name` ) > 0;

-- 6322ms 6377ms 不用索引

explain select * from `ent_file` a where instr(a.`ent_name`,'奧的斯') > 0;

-- 5ms 3ms 31ms 4ms 不用索引

explain select * from `ent_file` a where a.`ent_name` regexp '^杭州' ;

-- 87ms 78ms 75ms 不用索引

explain select * from `ent_file` a where a.`ent_name` regexp '有限責任公司$' ;

- 6056ms 6032ms 不用索引

explain select * from `ent_file` a where a.`ent_name` regexp '集團$' ;

select * from `ent_file` a where reverse(a.`ent_name`) like reverse(concat('%','奧的斯')) or a.`ent_name` like concat('奧的斯','%');

mysql like 查不到結果 中文 查詢優化

參考 mysql like keyword 不走索引替代方法 select locate xbar foobar 返回0 select locate bar foobarbar 返回4 select locate bar foobarbar 5 返回7 備註 返回 substr 在 str 中第一次...

mysql like替代方法

select t.from xx area t where instr tree path,1 0 select from table where instr field,str 0 1.select name from temp where instr str,1 0 包括sonnyboy 和so...

Mysql like 模糊查詢

模糊查詢一般形式 select 字段 from 表 where 某欄位 like 條件 其中關於條件,sql提供了四種匹配模式 1 表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文,請使用兩個百分號 表示。比如 select from user where u name lik...