首页 > 解决方案 > 为什么mysql查询花费太多时间来获取结果?

问题描述

我有一个包含两个表的数据库,一个是usersusers_activity

用户活动表有一些列,包括userid与用户表的 id 匹配的列。

我想使用 JOINS 从两个表中得到一些结果。

这是我的 MySQL 查询。请让我知道我的错误是什么/为什么这个查询花费了太多时间?

SELECT ua.userid, COUNT(ua.id) user_active, u.name 
FROM `user_activity` ua, users u 
WHERE   ua.target = 'Save Post' OR 
        ua.target = 'Send comment' OR 
        ua.target = 'Send Reply' 
        AND ua.created_on >= 1630454401 
        AND ua.userid = u.id 
GROUP BY ua.userid 
ORDER BY COUNT(ua.userid) DESC LIMIT 5

谢谢您的帮助。

标签: phpmysql

解决方案


如果您同时使用 AND 和 OR ,请在 where 子句的位周围加上括号

SELECT ua.userid, COUNT(ua.id) user_active, u.name 
    FROM `user_activity` ua, users u 
    WHERE 
        (
        ua.target = 'Save Post' OR 
        ua.target = 'Send comment' OR 
        ua.target = 'Send Reply' 
        )
    AND ua.created_on >= 1630454401 
    GROUP BY ua.userid 
    ORDER BY COUNT(ua.userid) DESC 
    LIMIT 5

当然,如果您正在处理十亿行,则需要一些时间

此外,您应该习惯 JOIN 语法,而不是旧的逗号分隔的表列表。它们更加灵活和高效

SELECT ua.userid, COUNT(ua.id) user_active, u.name 
FROM user_activity ua 
    JOIN users u ON ua.userid = u.id
WHERE 
    (
    ua.target = 'Save Post' OR 
    ua.target = 'Send comment' OR 
    ua.target = 'Send Reply' 
    )
AND ua.created_on >= 1630454401 
AND ua.userid = u.id 
GROUP BY ua.userid 
ORDER BY COUNT(ua.userid) DESC 
LIMIT 5

推荐阅读