免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 16636 | 回复: 6
打印 上一主题 下一主题

【已解决】mysql like模糊搜索效率问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-22 11:12 |只看该作者 |倒序浏览
本帖最后由 chinafenghao 于 2013-03-27 10:44 编辑

整个表有200万数据,我只要搜索最近两个月内的数据
select * from post where content like '%$中文%' and date > '两个月内时间'
date做了索引。两个月内的数据一直保持在大概5万-10万。
这样的like效率好吗?会随着整个表的增大而影响吗?假设说整表数据从200万增加到300万。而最近两个月数据还是5-10万。

论坛徽章:
0
2 [报告]
发表于 2013-03-22 12:57 |只看该作者
根据explain的结果,看是否使用了索引

当整表数据增加、命中数据不变的情况下,如果之前使用的是索引,之后应该还是会用索引。


有点小疑问:每次查询都返回5-10万?不做limit?

论坛徽章:
0
3 [报告]
发表于 2013-03-22 13:42 |只看该作者
date有索引,post是模糊查询没有索引。
limit有的,select * from post where content like '%$中文%' and date > '两个月内时间'  order by id desc limit 0,30
id是自增加主键

论坛徽章:
0
4 [报告]
发表于 2013-03-23 14:31 |只看该作者
把where中的date 放到前面去

论坛徽章:
0
5 [报告]
发表于 2013-03-23 17:09 |只看该作者
回复 4# aca_jingru
这个mysql会自动优化的吧


   

论坛徽章:
0
6 [报告]
发表于 2013-03-23 23:08 |只看该作者
本帖最后由 G8bao7 于 2013-03-23 23:09 编辑

回复 3# hq22

由于id是自增的,用下面的方式效率应该更高点
select p.* from post as p
    ,(select id from post where  date > '两个月内时间'  order by id limit 1) as t
where content like '%$中文%' and p.id>=t.id
order by p.id desc limit 0,30;


另外:where中AND 的顺序是无所谓的

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
7 [报告]
发表于 2013-03-25 10:29 |只看该作者
嗯,楼上的先取ID,然后用ID做顺序扫描的写法是个好方法。
当然前提是 自增ID 和 date是单调递增的。

通过主键顺序搜索映射到磁盘上就是顺序读。10万行1k的数据相当于100M,基本是秒级完成。
再加上like的匹配,相对于作业类型的SQL属于可接受范围。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP