mysql 时间范围查询优化 40C

select * from table where createtime between '2019-01-01 00:00:00' and '2019-12-31 23:59:59' and storeid=1;
实际数据量17万条,扫描了77万行,数据总量为375万条数据,查询耗时85秒,请问一下怎么才能优化
其中storeid和createtime都创建了索引

qq_41228873
Sea~Sky 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。可以使用分页一次返回固定条数,避免一次返回大量数据
3 个月之前 回复

4个回答

看符合createtime between '2019-01-01 00:00:00' and '2019-12-31 23:59:59' 的数据有多少
storeid=1
有多少
用子查询看看
select * from( select * from table where createtime between '2019-01-01 00:00:00' and '2019-12-31 23:59:59' ) where storeid=1
或者
select * from( select * from table where storeid=1 ) where createtime between '2019-01-01 00:00:00' and '2019-12-31 23:59:59'

另外你返回的数据有17万?那么得考虑数据通讯的开销。可以select必要的字段,而不是*来节约。

qq_30286285
qq1104682401 createtime between '2019-01-01 00:00:00' and '2019-12-31 23:59:59' 的数据有259万条 , storeid=1 有37万条,子查询,效果一样,只查询一个字段 需要16秒,也不大正常
3 个月之前 回复

可以把storeid放在时间的前面,你试下需要多久

qq_30286285
qq1104682401 时间一样 全字段 98秒, 一个字段15秒
3 个月之前 回复

msyql当查询数据大于五分之一时,就不走索引,所以得强制执行索引,在select * from table_name FORCE INDEX ( 组合索引 )
所谓组合索引,就是几个字段拼在一起组成的索引,排序有条件,像你的场景,组合索引,时间字段要排在最后

qq_30286285
qq1104682401 只查询一个字段,一年的5秒 查询全部字段的话 一年要132秒
3 个月之前 回复
qq_30286285
qq1104682401 回复椰海情韵: select * from dishorder where storeid = 1 and createtime>='2019-12-01 00:00:00' and createtime<='2019-12-31 23:59:59'; 这个语句 执行0.4秒 时间随着数据量增大而增大 应该是哪里处理有问题吧
3 个月之前 回复
weixin_41581226
椰海情韵 回复: 如果你这种数据量短时间内,都增加很大的话,建议你考虑 分库分表,所有数据在一个表操作,不论怎么优化sql,数据库都会存在瓶颈
3 个月之前 回复
weixin_41581226
椰海情韵 在不行,你就需要考虑分库分表了
3 个月之前 回复
weixin_41581226
椰海情韵 1.需要查询哪些字段,就查哪些字段, 把 *号改为需要查询的字段; 2.查询的那些字段,对有必要的字段加索引,也可以组成组合索引; 3.比如组合索引的名称为: zuhe_index ,那么查询的sql : select 字段 from 表 FORCE INDEX (zuhe_index) where 条件
3 个月之前 回复
weixin_41581226
椰海情韵 1.需要查询哪些字段,就查哪些字段, 把 *号改为需要查询的字段;
3 个月之前 回复
qq_30286285
qq1104682401 查询语句 就是上面 那个 能写具体点吗
3 个月之前 回复

改为连接查询加分页实现

qq_30286285
qq1104682401 做数据统计 部分要做分类统计
3 个月之前 回复
qq_41228873
Sea~Sky 子查询会创建临时表查询完毕后在删除,所以会收到影响
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐