我们的一个网站有一张表格,里面有大约60,000条记录。最近我们注意到页面超时,只能通过将内存限制设置为-1来解决。这允许页面加载,但速度非常慢。此外,我不相信这是解决问题的正确方法,因为很明显它表明事情不太正确。
我设法输出页面正在运行的查询:
SELECT u.*,
(SELECT COUNT(*) FROM enquiry e WHERE e.user_id = u.id AND e.deleted = 0 AND e.time_started != 0) AS opened_count,
(SELECT COUNT(*) FROM enquiry e WHERE e.user_id = u.id AND e.deleted = 0 AND e.confirmed = 1 AND e.time_started != 0) AS confirmed_count,
(SELECT COUNT(*) FROM enquiry e WHERE e.user_id = u.id AND e.deleted = 0 AND e.call_back = 1 AND e.time_started != 0) AS call_back_count
FROM user u
WHERE u.active = 1 AND u.deleted = 0
ORDER BY u.username
我在phpMyAdmin中运行此查询,返回结果需要30秒以上。
我觉得查询需要以某种方式进行优化,但我正在努力弄清楚如何。我猜我需要使用某种JOIN?
答案 0 :(得分:7)
您实际上正在运行> 180,000个查询,因为这3个子查询中的每一个都将针对用户表中的每一行运行一次。
您可以尝试简化与某些群组的标准联接,例如
SELECT user.*,
COUNT(enq.id) AS opened_count
SUM(e.confirmed = 1) AS confirmed_count
SUM(e.call_back = 1) AS call_back_count
FROM user
LEFT JOIN enquiry ON enquiry.user_id = user.id
WHERE user.active = 1 and user.deleted AND enquiry.deleted = 0
GROUP BY user.id