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

时间:2022-03-30 23:17:50





数据的量级是 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了?



9 个解决方案

#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

#2


用UNION就可以了

#3


说错了,用 UNION ALL
很多个条件的and,该如何优化?

#4


楼上几位说的都是对的,使用union all 是个不错的选择

#5


这个查询优化的空间的很小了。

每一列都建立了单列索引,在实际运行这个语句时,也只能用到一个索引。

建议LZ 在动态拼接这个 SQL时 , 把那些没有条件的列也拼出来,比如 colA = colA 这样,这些列是尽可能多的被用户使用到的列。

有点乱,欢迎回复本帖子讨论。

#6


楼上说的对,使用“UNION ALL”替换"OR"即可,添加会增加或删除 ,在程序中判断添加或删除即可 。

#7


限制一个时间字段必选

#8


总有必要的限制条件吧,在必要的限制条件上建联合索引

#9


用阿里云的搜索了,不过不是我搭建的。

#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

#2


用UNION就可以了

#3


说错了,用 UNION ALL
很多个条件的and,该如何优化?

#4


楼上几位说的都是对的,使用union all 是个不错的选择

#5


这个查询优化的空间的很小了。

每一列都建立了单列索引,在实际运行这个语句时,也只能用到一个索引。

建议LZ 在动态拼接这个 SQL时 , 把那些没有条件的列也拼出来,比如 colA = colA 这样,这些列是尽可能多的被用户使用到的列。

有点乱,欢迎回复本帖子讨论。

#6


楼上说的对,使用“UNION ALL”替换"OR"即可,添加会增加或删除 ,在程序中判断添加或删除即可 。

#7


限制一个时间字段必选

#8


总有必要的限制条件吧,在必要的限制条件上建联合索引

#9


用阿里云的搜索了,不过不是我搭建的。