不加全文索引解决模糊查询的问题
作者:admin 日期:2018-08-29
模糊查询是我们在开发中经常会碰到的问题, 比如会员列表会根据用户昵称搜索会员, 根据商品标题搜索商品之类的. 如果数据量不是很大(比方说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 "%远洋%');
再加其它条件即可.
数据不多的情况下可以使用这种方式进行优化, 多了再引入全文索引之类的.
评论: 0 | 查看次数: 40579