網上很多優化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...