不加全文索引解决模糊查询的问题

 模糊查询是我们在开发中经常会碰到的问题, 比如会员列表会根据用户昵称搜索会员, 根据商品标题搜索商品之类的. 如果数据量不是很大(比方说100W以内), 又没有比如文章内容的情况下可以不需要搞全文索引. 

比如我们的场景是这样的, SAAS软件可能会有多公司, 每个公司下有很多的会员. 我们现在需要搜索某个公司下昵称中包含"远洋"的这样一些会员. member表包含600多万条数据, 其中company_id=184306的用户的会员有82W. 

 

常规的, 我们可以写这样一个语句. 

select * from member where company_id = 184306 and nickname like "%远洋%';

但是结果是非常糟糕的, 耗时1 row in set (15.50 sec)

有人说, 建个company_id, nickname的联合索引啊, 其实上面语句就是在有这样一个索引的情况下执行的. 

KEY `idx_company_nickname` (`company_id`,`nickname`)

然后Mysql并没有走这个索引, 他选择了全表扫. 

其实MYSQL5.6之后引入了ICP机制, 可以进行index condition. 我们可以强制指定索引

select * from member force index(`idx_company_nickname`) where company_id = 184306 and nickname like "%远洋%';

飞快. 只花了0.22秒. 

但通常我们的实际场景没有那么单一, 有可能会混合其它的条件, 比方说注册时间或其它的. 此时我们可以将条件进行转化, 将nickname的匹配转化成一个in查询. 

select * from member where company_id = 184306 and id in (select id from member force index(`idx_company_nickname`) where company_id = 184306 and nickname like "%远洋%');

再加其它条件即可. 

数据不多的情况下可以使用这种方式进行优化, 多了再引入全文索引之类的. 



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 40388