我使用以下查詢來查找需要根據用戶的設置和時區發送每日提醒的用戶。它的工作原理是,它使用了大約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/ –
我也會考慮將活動添加到您的索引中。 –