2020-07-24
mysql sql优化
SELECT
account_name,
FROM_UNIXTIME(
ROUND(request_time / 1000),
‘%Y-%m-%d’
) date,
country_number,
SUM(
IF (
need_resend = '0',
message_size,
0
)
) AS send,
SUM(
CASE message_result
WHEN 'DELIVRD' THEN
message_size
ELSE
0
END
) 'success',
SUM(
CASE message_result
WHEN '' THEN
message_size
ELSE
0
END
) AS 'unknown',
SUM(
IF (
message_result = 'DELIVRD'
OR (
message_result = ''
AND need_resend = '0'
),
(price) *- 1,
0
)
) AS fee
FROM
send_message
WHERE
request_time >= 1595433600000
AND request_time <= 1595519999999
GROUP BY
message_result,
account_name
ORDER BY
request_time DESC
环境:
centos 7
mysql 5.7.25
表数据量:四千六百万
where结果集:五百一十万
想请问下上面的这个sql应该如何优化?
我的疑惑:
1.从索引角度优化,只能在request_time字段加索引,因为mysql在where中字段进行比较后,后面的字段是不能用到索引的,所以group by的效率不高
2.根据where的request_time查出来的结果集占到表的11%,优化器没有走索引,这个可以通过sql加强制索引解决,但是要改代码,请问还有其他的办法吗?
3.我认为查询字段的处理不合理,但是我把那几个sum的函数去掉之后,查询时间依然没有减少
4.我们经常需要做一段时间内的统计,类似select … from … where xx > … and xx < … order by a,b,请问这种sql应该怎么优化,这个其实和第一点类似,就是在where做了的比较之后,怎样能让group by也提升性能,我目前知道的办法是加上order by null,那sql要是还有其他字段的排序呢,比如第一点的sql
期待有大神能给我解惑,非常感谢!
我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏

评论
