網上很多優化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('奧的斯','%');
原文地址:https://blog.csdn.net/weixin_39800144/article/details/81510785