【发布时间】:2019-01-23 15:32:43
【问题描述】:
我的团队维护着一个每周处理数百万条记录的应用/数据库。这个过程相当简单:
- 向各种活动的联系人发送通知
- 发送通知时将contact_id、campaign_id、message_id、created_at、updated_at写入日志
- 读取每个 notificationID/notification_messageID 的记录计数,并在报告中显示给用户。
日志的写入和读取过程需要非常长的时间,我们正在寻找优化它的方法。
write 语句在发送通知时发生。它在一个查询中批量插入 20 条记录。这是一个例子:
INSERT INTO `contact_notification_logs` (`id`, `contact_id`, `campaign_id`,
`message_id`, `created_at`, `updated_at`, `is_reset`)
VALUES
(NULL, '1', '1', '1', '2019-01-23 20:16:21', '2019-01-23 20:16:24',
'0'),
发生了两个读取语句:
- 这个非常简单,它在列出所有活动的页面上运行,并显示今天发送的当前通知计数:
SELECT COUNT(id) FROM contact_notification_logs
WHERE DATE(created_at) = '[current date]'
这个虽然简单,但执行起来仍然需要很长时间。
- 第二个读取语句有点复杂,因为它内置在应用程序的报告工具中,用户可以在其中指定参数,但根“选择计数”是相同的。
这是一个例子:
SELECT COUNT(id) FROM contact_email_logs
WHERE DATE(created_at) > '2018-12-23'
AND DATE(created_at) < '2019-01-23'
AND campaign_id = 27
AND message_id = 133
加分几点:
数据需要能够实时拉取。这意味着如果我想在这个确切的时间点检查所有通知活动的计数,我可以。所以查询会在那个时候运行以计数。
contact_notification_logs 中有 28,740,585 条记录。
我是否遗漏了一些明显的东西,可以让我们优化这些查询的运行时间?
【问题讨论】:
标签: mysql database optimization query-optimization