Mysql Like 性能优化总结

网上很多优化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 '集团$' ;
-- 这个reverse方式,效果也不明显 SELECT * FROM `ent_file` a WHERE REVERSE(a.`ent_name`) LIKE REVERSE(CONCAT('%','奥的斯')) or a.`ent_name` LIKE CONCAT('奥的斯','%'); -- 表级锁 情况 SHOW STATUS LIKE 'table%'; -- 行级锁 情况 SHOW STATUS LIKE 'innodb_row_lock%'; -- 进程列表 SHOW PROCESSLIST ; SHOW STATUS ;


作者:lightClouds917
来源:CSDN
原文:https://blog.csdn.net/weixin_39800144/article/details/81510785
版权声明:本文为博主原创文章,转载请附上博文链接!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值