2011-09-30 44 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