MySQL - 昂贵的子查询

时间:2014-08-25 03:51:41

标签: mysql sql indexing

我的查询持续运行13秒,始终如一:

SELECT COUNT(*) AS Counter 
FROM Groups_Users gu 
JOIN Groups g ON gu.GroupID = g.GroupID 
WHERE (
    (gu.UserID = 3 AND gu.IsAdmin = 1 AND g.GroupID = 395) 
    OR g.OrganizationID IN ( 
        SELECT OrganizationID FROM Organizations_Users WHERE UserID = 3 AND IsAdmin = 1 ) 
)

向Groups_Users和Organization_Users添加索引后,它的时间不到1秒。所以,问题解决了,除了我希望这两个表中的记录数量增长很多。而且我想知道我的子选择和/或加入是否效率低下并且可以做得更好。也许在某些时候,当记录数从8,000增加到100,000时,性能会再次降低,因为子选择效率很低。

有关更好地进行此查询的任何想法吗?

1 个答案:

答案 0 :(得分:1)

SELECT COUNT(*) AS Counter 
FROM Groups_Users gu 
JOIN Groups g ON gu.GroupID = g.GroupID 
WHERE
(   
    (    gu.UserID = 3 
     AND gu.IsAdmin = 1 
     AND g.GroupID = 395
    ) 
    OR EXISTS 
        (   SELECT 1 
            FROM Organizations_Users ou 
            WHERE ou.UserID = 3 
              AND ou.IsAdmin = 1 
              AND ou.organizationid = g.organizationid
        ) 
)

基本上你说选择1满足这些条件..如果它们是真的那么存在的查询是真的它将包括它。所以你要做的就是将AND ou.organizationid = g.organizationid添加到子查询中,你很高兴