SELECT s.* FROM pre_common_member s WHERE s.`username` LIKE('%植物大战僵尸%') LIMIT 100;

like后面接'%关键字%' 这样是用不到索引的,会导致全表扫描,这条SQL查询耗时,见下图:

生产环境一个like模糊匹配SQL优化_like

耗时:27.89秒

----------------------------------------------------------------------------------------

优化方案:

一、如果模糊查询不要求很准确,可以修改为:

SELECT s.* FROM pre_common_member s WHERE s.`username` LIKE('植物大战僵尸%') LIMIT 100;

like '关键字%'这样是可以用到索引的,这条SQL查询耗时,见下图:

生产环境一个like模糊匹配SQL优化_like_02

耗时:0秒


二、如果模糊查询要求很准确,可以修改为:

select s.* FROM pre_common_member s join
(SELECT uid FROM pre_common_member WHERE username LIKE('%植物大战僵尸%') LIMIT 100)tmp
on s.uid=tmp.uid;

这条SQL查询耗时,见下图:

生产环境一个like模糊匹配SQL优化_优化_03

耗时:9.17秒