2011-09-30 43 views
0

我使用以下查詢來查找需要根據用戶的設置和時區發送每日提醒的用戶。它的工作原理是,它使用了大約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服務器發送提醒。 你能幫我優化這個查詢,以便它不使用這麼多資源嗎?

謝謝(對不起,我的英文版)

+1

首先開始的地方存放在數據庫中 - 看看上的所有索引策略那些「id」字段。 –

+0

JetProfiler如果您有資源 - http://www.jetprofiler.com/ –

+0

我也會考慮將活動添加到您的索引中。 –

回答

0

您是否已將字段編入索引? 這裏是一個建議:

嘗試索引所有表上的user_id字段,它應該使其更快。

而且日期的轉換是吃了CPU的時候,你應該在UTC格式的日期這樣你就可以避免巨大的開銷

+0

「用戶」表的列名是「id」rest是「user_id」。可以嗎? – Sallar

+1

是的,命名並不重要 - 索引很重要。 –

+0

好的,謝謝,讓我檢查 – Sallar