MySQL查询使用太多CPU

时间:2011-09-30 17:53:33

标签: php mysql pdo query-optimization

我使用以下查询来查找我需要根据其设置和时区发送每日提醒的用户。它工作,但发现它使用大约50%的CPU,即使我添加限制0,100它真的很重。

(它甚至导致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 个答案:

答案 0 :(得分:0)

您是否已将字段正确编入索引? 这是一个建议:

尝试将所有表上的user_id字段编入索引,使其更快。

日期转换也占用了cpu时间,你应该以UTC格式存储数据库中的日期,这样可以避免巨大的开销