无效的日期范围导致检查太多行
WHERE DATE(created_at) > '2018-12-23'
AND DATE(created_at) < '2019-01-23'
AND campaign_id = 27
AND message_id = 133
不要那样写日期比较。它不能使用包含
created_at
因为它隐藏在函数调用中(
DATE()
)而是:
WHERE created_at >= '2018-12-23'
AND created_at < '2018-12-23' + INTERVAL 1 MONTH
如果
数据()
东西是由第三方包生成的,你需要放弃它。
缺乏合适的指标
然后…您需要一个复合索引:
INDEX(campaign_id, message_id, -- in either order
created_at) -- after those
就为了“今天”
SELECT COUNT(*) FROM contact_notification_logs
WHERE created_at >= '[current date]'
AND created_at < '[current date]' + INTERVAL 1 DAY
INDEX(created_at) -- the previous index will not help for _this_ query
需要汇总表
有2800万行,你可能会发现我上面的建议是不够的。再提高10倍,
build and maintain a Summary Table
. 建议使用天,而不是周或月作为解决方案。
其他
不要使用
COUNT(id)
除非你需要检查
id
是
NULL
. 相反,使用通用模式:
COUNT(*)
.
如果
创造在
IS型
DATE
,原始查询是一个月,减去一天。如果是
DATETIME
,则缺少开始日期的午夜。使用我的代码,无论数据类型如何,它都能正常工作。
如需进一步讨论,请提供
SHOW CREATE TABLE
.