2013-09-30 253 views
0

我们的一个网站有一个约60'000条记录的表格。最近我们注意到页面超时,只能通过将内存限制设置为-1来解决。这允许页面加载,但速度很慢。此外,我不相信这是解决问题的正确方法,显然这表明事情并不完全正确。MySQL子查询选择速度很慢

我到输出管理的查询页面正在运行:我在phpMyAdmin跑到这个查询

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 

,并接管30秒返回结果。

我觉得查询需要以某种方式优化,但我正在努力研究如何。我猜我需要使用某种JOIN?

+3

请提供'EXPLAIN'和'DESCRIBE'结果。 – Kermit

回答

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 
+0

这不需要一个组? – Laurence

+0

Woops,对。谢谢。 –

+0

谢谢马克。这已经造成了巨大的变化。我需要帮助的一件小事 - 如何将我的WHERE条件集成到COUNT查询中,即'WHERE enquiry.time_started!= 0' – GSTAR