如何优化此SQL查询以获得更快的结果

时间:2012-11-30 15:24:32

标签: php mysql sql

我有一些奇怪的SQL查询问题。我正在使用MySQL,我会改变数据库结构,但我不能。所以我必须用查询来解决我的问题。

所以我有3张桌子。挑战,用户_挑战和用户订阅。我需要离开的地方3如下:

我需要列出所有挑战的列表.private = 0并且我必须排除当前用户ID(users_challenges.iduser = 414)下出现在Users_challenges中的所有挑战。 然后我需要挑战可以有challenge.private = 1或0,但它们列在第三个表(users_subscribed.iduser = 414)中,并且在这里我必须排除挑战表中的所有读取ID。 最后,我需要将所有结果统一起来,并按时间限制。

我希望我说得对,因为它至少对我而言非常困惑:D

我当前的查询需要26秒才能执行:

SELECT *
FROM challenges
WHERE challenges.private = 0
AND challenges.isquest = 1
AND challenges.title like '%%'
AND challenges.id NOT
IN (
        SELECT users_challenges.idchallenge
        FROM users_challenges
        WHERE users_challenges.iduser = 414
        AND users_challenges.idquest IS NULL
        GROUP BY users_challenges.idchallenge
)

UNION

SELECT *
FROM challenges
WHERE challenges.isquest = 1
AND challenges.title like '%%'
AND challenges.iduser
IN (
                SELECT users_subscriptions.idsubscribedto
                FROM users_subscriptions
                WHERE users_subscriptions.iduser = 414
                UNION
                SELECT 414 AS idsubscribedto
)
AND challenges.id NOT
IN (
        SELECT users_challenges.idchallenge
        FROM users_challenges
        WHERE users_challenges.iduser
        IN (
                SELECT users_subscriptions.idsubscribedto
                FROM users_subscriptions
                WHERE users_subscriptions.iduser = 414
                UNION
                SELECT 414 AS idsubscribedto
        )
        AND users_challenges.idquest IS NULL
        GROUP BY users_challenges.idchallenge
)

ORDER BY TIME DESC
LIMIT 0,30

那么有没有办法如何简化此查询并更快地获得相同的结果? THX

1 个答案:

答案 0 :(得分:0)

如果and challenges.title like '%%' 是一个错字,我会删除它作为第一步,因为它始终是真的。

根据Rewriting Subqueries as Joins,使用联接代替in (subquery)可能会有所帮助。

您还可以单独运行这两个查询,以查看其中一个查询是否很慢。然后你可以专注于慢速部分并单独留下快速部分。