我使用以下查询来查找需要根据用户的设置和时区发送每日提醒的用户。它的工作原理是,它使用了大约50%的CPU,甚至当我增加Limit 0,100时,它的确很重。MySQL查询使用太多的CPU
(它甚至会导致phpMyAdmin的崩溃或东西)
用户表:3000条记录, 帖子表:12000+记录, 设置表:3000条记录, 提醒表:80000条记录(保存user_id说明和日期防止重复)
SELECT u.`id`, u.`fullname`, u.`email`, u.`hash`, s.`timezone`
FROM `users` u
LEFT JOIN `reminders` rm ON rm.`user_id` = u.`id` AND rm.`date` = CURDATE()
LEFT JOIN `settings` s ON s.`user_id` = u.`id`
LEFT JOIN `posts` p ON p.`user_id` = u.`id` AND p.`date` = DATE(CONVERT_TZ(UTC_TIMESTAMP, 'UTC', s.`timezone`))
WHERE HOUR(CONVERT_TZ(UTC_TIMESTAMP, 'UTC', s.`timezone`)) = s.`notify_hour`
AND s.`notify` = 1 AND u.`active` = 1 AND rm.`id` IS NULL AND p.`id` IS NULL
GROUP BY u.`id` LIMIT 0,100
我运行此查询每隔10分钟,我被sendgrid.com SMTP服务器发送提醒。 你能帮我优化这个查询,以便它不使用这么多资源吗?
谢谢(对不起,我的英文版)
首先开始的地方存放在数据库中 - 看看上的所有索引策略那些“id”字段。 –
JetProfiler如果您有资源 - http://www.jetprofiler.com/ –
我也会考虑将活动添加到您的索引中。 –