我的团队维护一个应用程序/数据库,每周处理数百万条记录。这个过程相当简单:
-
向联系人发送各种活动的通知
-
发送通知时,将联系人ID、活动ID、消息ID、创建时间、更新时间写入日志
-
读取每个notificationid/notification\u 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'),
有两个read语句:
-
这个非常简单,它运行在列出所有活动的页面上,并显示今天发送的通知的当前计数:
SELECT COUNT(id) FROM contact_notification_logs
WHERE DATE(created_at) = '[current date]'
这个虽然简单,但执行起来仍然需要很长时间。
-
第二个read语句有点复杂,因为它内置在应用程序的报告工具中,用户可以在其中指定参数,但根“select count”是相同的。
下面是一个例子:
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
还有几点:
-
数据需要能够实时提取。也就是说,如果我想在这个时间点检查所有通知活动的计数,我可以。所以查询运行以计数所有的时间。
-
联系人通知日志中有28740585条记录。
我是否遗漏了一些显而易见的东西,使我们能够优化这些查询的运行时间?