数据的量级是 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
#4
楼上几位说的都是对的,使用union all 是个不错的选择
#5
这个查询优化的空间的很小了。
每一列都建立了单列索引,在实际运行这个语句时,也只能用到一个索引。
建议LZ 在动态拼接这个 SQL时 , 把那些没有条件的列也拼出来,比如 colA = colA 这样,这些列是尽可能多的被用户使用到的列。
有点乱,欢迎回复本帖子讨论。
每一列都建立了单列索引,在实际运行这个语句时,也只能用到一个索引。
建议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
#4
楼上几位说的都是对的,使用union all 是个不错的选择
#5
这个查询优化的空间的很小了。
每一列都建立了单列索引,在实际运行这个语句时,也只能用到一个索引。
建议LZ 在动态拼接这个 SQL时 , 把那些没有条件的列也拼出来,比如 colA = colA 这样,这些列是尽可能多的被用户使用到的列。
有点乱,欢迎回复本帖子讨论。
每一列都建立了单列索引,在实际运行这个语句时,也只能用到一个索引。
建议LZ 在动态拼接这个 SQL时 , 把那些没有条件的列也拼出来,比如 colA = colA 这样,这些列是尽可能多的被用户使用到的列。
有点乱,欢迎回复本帖子讨论。
#6
楼上说的对,使用“UNION ALL”替换"OR"即可,添加会增加或删除 ,在程序中判断添加或删除即可 。
#7
限制一个时间字段必选
#8
总有必要的限制条件吧,在必要的限制条件上建联合索引
#9
用阿里云的搜索了,不过不是我搭建的。