使用MySQL时子查询、限制和顺序的性能注意事项

使用MySQL时子查询、限制和顺序的性能注意事项,mysql,sql,performance,subquery,sql-limit,Mysql,Sql,Performance,Subquery,Sql Limit,目标:选择正在进行的游戏5的概率为50%,我们需要检查20条记录 -- Approach 1: Do everything within MySQL -- -------------------------------------- SELECT u.* FROM USERS u WHERE ( -- n_ongoingGames for user < 5 ( SELECT COUNT(gameID) AS n_ongoingGames

目标:选择正在进行的游戏<5的10个用户

方法1:在MySQL中做任何事情

选择users LIMIT 10并为每个用户选中n_ongogames

方法2:SQL+结果集分析

获取30个用户的记录。 对于每条记录,再次转到db并检查n_ongoingGames。假设每个用户n_ongoingGames>5的概率为50%,我们需要检查20条记录

-- Approach 1: Do everything within MySQL
-- --------------------------------------
SELECT u.*
FROM USERS u
WHERE 
    ( -- n_ongoingGames for user < 5
        (
            SELECT COUNT(gameID) AS n_ongoingGames
            FROM games g
            WHERE 
                (g.player1_userID = u.userID) OR 
                (g.player2_userID = u.userID) OR
                (g.player3_userID = u.userID) OR
                ...
                ...
                ...
                (g.player10_userID = u.userID)
        ) < 5
    ) AND
    (u.cash_balance > 500)
ORDER BY u.user_rating
LIMIT 10;


-- Approach 2: SQL + result-set analysis
-- -------------------------------------
SELECT u.*
FROM USERS u
WHERE
    (u.cash_balance > 500)
ORDER BY u.user_rating
LIMIT 30;
问题:

在方法1中,MySQL是否为users表中的每个用户检查用户<5的n_ongoingGames? 哪种方法更快? 如果只需要1个用户而不是10个限制1,那么哪种方法更快会有区别吗
谢谢。

假设一个用户不能同时是两个玩家,我建议如下:

SELECT u.*
FROM USERS u
WHERE u.cash_balance > 500 AND
      ((SELECT COUNT(*) AS n_ongoingGames
        FROM games g
        WHERE g.player1_userID = u.userID
       ) +
       (SELECT COUNT(*) AS n_ongoingGames
        FROM games g
        WHERE g.player2_userID = u.userID
       )
      ) < 5
ORDER BY u.user_rating
LIMIT 10;
具有以下索引:gamesplayer1\u userID和gamesplayer2\u userID。你还需要一个关于用户的索引;一种可能是usersuser_评级、现金余额,但我认为MySQL不够聪明,无法使用索引按顺序扫描表。您可能必须满足于userscash_余额


游戏中的指标意味着可以在指标中满足计数。这应该是一种特别快速的计数方式。如果删除现金余额的条件,那么用户SUSER_评级的索引应该会使查询速度相当快。

为什么第一次查询限制为10?比方说,此应用程序有助于10个用户的小组讨论。每个用户最多只能参加5次正在进行的讨论。对不起,我不明白什么是小组讨论,请从您的模型描述的角度来看。此外,这不符合最初的要求,即选择正在进行的游戏小于5%的用户,该要求未提及任何用户限制。从sql查询的角度来看,我确信这个限制是不相关的。如果对行数有数量限制,则应通过应用程序或实际的数据库限制来确保。10为用户提供了一个讨论/辩论的主题。用户可以同时参与多个辩论/讨论。但是n_同时辩论<5。你说得对-我相应地修改了目标陈述,并在其中添加了10。好的,让我回顾一下,为之前的不清楚道歉。一个游戏由10个用户组成。对于一个新游戏,我们想选择10个用户,我们正在现有游戏中检查n_ongoingGames是否小于5。潜在用户可能正在以player1、player2的身份进行播放。。。任何现有游戏中的玩家10。