2012-11-30 66 views
0

我有一個奇怪的SQL查詢的問題。我使用MySQL,我會改變數據庫結構,但我不能。所以我必須解決我的問題與查詢。如何優化此sql查詢更快的結果

所以我有3個表格。挑戰,用戶挑戰和用戶訂閱。我需要從那裏得到3是以下內容:

我需要所有具有challenges.private = 0的挑戰的列表,並且我必須排除Users_challenges在當前用戶標識(users_challenges.iduser)下出現的所有挑戰= 414)。 然後我需要challenges.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

'AND challenges.title like'%%''是什麼意思?與前導'%'匹配的匹配會禁用索引。 –

+0

這是因爲有時我搜索標題。也許我應該排除這一行,如果搜索字符串是空的? Thx的信息,我不知道,就像領先%禁用索引的使用 – BoonZ

回答

0

如果and challenges.title like '%%'一個錯字,我會刪除這個作爲第一步,因爲它始終是真實的。

根據Rewriting Subqueries as Joins,使用連接代替in (subquery)可能是有益的。

您也可以單獨運行這兩個查詢,以查看是否其中一個查詢速度較慢。然後,您可以專注於慢速部分,並讓快速部分獨自一人。

+0

好吧,這不是一個錯字,如果提供搜索數據,然後它通過通配符字符。在PHP中,我有challenges.title行'%$ search%'。好吧,我會嘗試用連接重寫它,而不是看看會發生什麼。 – BoonZ