日期:2014-05-16  浏览次数:20783 次

关于模糊查询 like 的优化,求高手解答
SQL code


SELECT a.id,a.userid,a.weibo,a.sina_uid,a.sina_nick,a.addtime,a.avatarUrl,b.nickname as nick

    FROM

        tgw_weibo  a 
        NNER JOIN tgw_userinfor b

    on  a.userid != 0 AND a.userid= b.userid WHERE b.platformid = 1 AND a.platformid =1 AND a.weibo like '%1%' LIMIT 0,5




现在有300多万条数据,查出时间要3秒多。有什么好方法能提高速度吗?表结构是innodb,没法做全文索引

------解决方案--------------------
尽量开头不要用%这样会好一些。
这个语句已经很优化了,只是看表上的索引等情况了。

------解决方案--------------------
like '%1%':这种形式无法使用索引
在tgw_weibo、tgw_userinfor :建立userid、platformid 复合索引

------解决方案--------------------
show index from tgw_weibo
show index from tgw_userinfor 

explain SELECT a.id,a.userid,a.weibo,a.sina_uid,a.sina_nick,a.addtime,a.avatarUrl,b.nickname as nick

FROM

tgw_weibo a 
NNER JOIN tgw_userinfor b

on a.userid != 0 
AND a.userid= b.userid 
WHERE b.platformid = 1 AND a.platformid =1 AND a.weibo like '%1%' LIMIT 0,5
贴出来以供分析。
------解决方案--------------------
估计是a.weibo like '%1%'这个慢了,无法使用索引,weibo内容是什么
------解决方案--------------------
#8楼 图不方便分析,建议直接贴文本结果。
------解决方案--------------------
create index xxxx on tgw_weibo (userid,platformid);
------解决方案--------------------
create index xxxx on tgw_weibo (userid,platformid); 这个语句的结果是什么? 有一样的并不影响创建索引啊? 你又不是要创建唯一索引,只是个普通索引而已。
------解决方案--------------------
你两个表的记录各有多少?
------解决方案--------------------
引用加了,速度还是没什么变化

------解决方案--------------------
还有两个表的platformid = 1的记录数又各有多少
------解决方案--------------------
反正尽量用小表驱动大表吧
------解决方案--------------------
探讨
a.weibo like '%1%' 这玩意有什么优化方案吗,感觉最费时了

------解决方案--------------------
去掉AND a.weibo like '%1%' LIMIT 0,5 要17秒多 160万多条记录
不去掉要多长时间

a.weibo like '%1%'->在weibo上建立复合索引
修改成这样:
a.weibo like '1%'
union
a.weibo like '%1'
------解决方案--------------------
探讨
不去掉就是3秒多,

a.weibo like '1%'
union
a.weibo like '%1' 这样能搜索出所有包含1的数据吗

------解决方案--------------------
测试了一下,确实是这样,a.weibo like '%1%'无法优化
------解决方案--------------------
在ORACle中我一般用以下方法:
1、表分区,并行查询
2、模拟全文索引,做一下结构化索引优化
3、尽可能插入更多的其他限制条件减少遍历WEIBO的记录次数
------解决方案--------------------
MYISAM或者INNODB只是在存储上不同,对你的语句来说,是一样的。仍然是 like '%1%'

对于这种 %1% 是无法进行优化的。建议你把优化的关注点放在其它连接字段上。
------解决方案--------------------
试试这个语句。
SELECT a.id,a.userid,a.weibo,a.sina_uid,a.sina_nick,a.addtime,a.avatarUrl,b.nickname as nick