MySQL子查询选择非常慢

标签 mysql sql performance

我们的一个网站有一个表,其中包含大约 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 吗?

最佳答案

您实际上正在运行 >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

关于MySQL子查询选择非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19102275/

相关文章:

android - 如何减少Activity的加载时间?

mysql sum() 没有给出正确的十进制值

mysql - 如何选择外键表中使用的记录

performance - 如何有效地构造一个大型 SparseArray?包这个?

sql - PostgreSQL age() 函数 : different/unexpected results when landing in dfferent month

mysql - SQL查询验证-简单

Java ByteBuffer 性能问题

mysql - 从 shell 中 grunt 导入数据库

php - 使用 PHP 从 MediaWiki 数据库中提取压缩文本

mysql - 按组排序的数据