很多个条件的and,该如何优化?

Longerandlonger 2014-11-15 10:58:32





数据的量级是 100万

语句可能是这样的:

select * from my_table where a = 1 and (b = 'apple' or b = 'android' ) and c >= 10000 and c <= 200000 and d >= '2014-10-10 12:59:10' order by d desc limit 40;

where的条件可能会因为用户输入而进行增删。

where的查询条件,每一个字段都有一个“单列索引”,没有“联合索引”。

之所以不建立联合索引,是因为两个原因:1.某些查询条件可能会删除。2.某些查询条件是“范围查询”。

现在遇到问题了:这个查询有时候需要很久才能返回数据(几十秒)。请问这样的查询有没有什么优化的方法?

或者说,这种情况下应该搭建Lucene了?



...全文
876 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Longerandlonger 2014-12-31
  • 打赏
  • 举报
回复
用阿里云的搜索了,不过不是我搭建的。
cshiqin 2014-12-02
  • 打赏
  • 举报
回复
总有必要的限制条件吧,在必要的限制条件上建联合索引
rucypli 2014-12-01
  • 打赏
  • 举报
回复
限制一个时间字段必选
知道就是你 2014-12-01
  • 打赏
  • 举报
回复
楼上说的对,使用“UNION ALL”替换"OR"即可,添加会增加或删除 ,在程序中判断添加或删除即可 。
卖水果的net 2014-11-29
  • 打赏
  • 举报
回复
这个查询优化的空间的很小了。 每一列都建立了单列索引,在实际运行这个语句时,也只能用到一个索引。 建议LZ 在动态拼接这个 SQL时 , 把那些没有条件的列也拼出来,比如 colA = colA 这样,这些列是尽可能多的被用户使用到的列。 有点乱,欢迎回复本帖子讨论。
zheng_luck 2014-11-27
  • 打赏
  • 举报
回复
楼上几位说的都是对的,使用union all 是个不错的选择
pony520 2014-11-15
  • 打赏
  • 举报
回复
说错了,用 UNION ALL
pony520 2014-11-15
  • 打赏
  • 举报
回复
用UNION就可以了
ayzen1988 2014-11-15
  • 打赏
  • 举报
回复 1

不要用or
改用union all试试
select * from
(
select * from (select * from my_table where    a = 1  and  b = 'apple'   and  c >= 10000 and  c  <=  200000   and   d >= '2014-10-10 12:59:10'   order by d desc limit 40)a
union all
select * from (select * from my_table where    a = 1  and  b = 'android'   and  c >= 10000 and  c  <=  200000   and   d >= '2014-10-10 12:59:10'   order by d desc limit 40)b
)c
limit 40

56,940

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧