关于模糊查询 like 的优化,求高手解答解决方案

关于模糊查询 like 的优化,求高手解答解决方案

关于模糊查询 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

关于模糊查询 like 的优化,求高手解答解决方案

相关文章:

你感兴趣的文章:

标签云: