2010-12-16 76 views
0

我似乎無法弄清楚這一點對我的生活:XGROUP_CONCAT來自多個子查詢?

我有兩個表..

  • 1 =標籤鏈接
  • 2 =標籤數據

當我查詢配置文件時,每個配置文件可以在標籤鏈接表中包含多個條目。 一旦我檢索到標籤鏈接,我想從標籤數據表中獲取標籤文本。如果分配給用戶,這樣是不完全的解決方案,因爲每個查詢需要5 SELECT * FROM platform.tagWords WHERE tagId IN (SELECT tagId FROM platform.user sProfilesTags WHERE userId = 1001)

但經過每個標籤(約50,000),然後檢查:

我可以做到這一點8秒。

有沒有辦法扭轉這種情況?

任何提示或建議將不勝感激。

在此先感謝!

*更新

所以我想這給了加入刺,但我堅持有太多:P

SELECT                   

    GROUP_CONCAT(tagWords.tagWord SEPARATOR ', ') AS tags,       
    usersProfiles.*                 

FROM platform.users u               

INNER JOIN platform.usersProfilesTags ON usersProfilesTags.userId = u.userId 
INNER JOIN platform.usersProfiles ON usersProfiles.userId = u.userId   
INNER JOIN platform.tagWords ON tagWords.tagId = usersProfilesTags.tagId  

WHERE u.userName = 'mattstest' 
+0

您提到了配置文件,但表格是標記數據? – 2010-12-16 00:05:06

+0

是的,另一個(始發表)是usersProfiles,我從中獲取userId以查找從標記鏈接錶鏈接的標記。 – 2010-12-16 00:18:56

+0

什麼是表模式(表的'CREATE'語句)?加入聲明的結果不是你想要的嗎? – outis 2010-12-16 01:58:00

回答

-1

你的第一個查詢看起來不錯。如果需要5-8秒,那麼你可能會錯過usersProfilesTags(userId)的索引。

試圖在一個查詢中執行此操作比執行兩個單獨的查詢更困難,可能會更慢:一個查詢獲取配置文件,另一個查詢獲取標籤。通常,當您運行多個簡單查詢而不是一個大型複雜查詢時,MySQL效果最佳。子查詢是一個相對較新的功能,往往表現不佳。

另請注意,對於GROUP_CONCAT()查詢,您缺少GROUP BY。您需要在GROUP BY列表中列出userProfiles中的每列。

+3

這是個不好的建議。不要試圖將問題分解爲多個小問題,相反。子查詢支持是在8年前添加的,並沒有任何先天性能問題。發出的查詢越多,連接和通信開銷就越多,磁盤IO被浪費的次數越多,如果查詢結合起來就不需要檢索行,並且浪費的內存越多,拋出。 – 2010-12-16 00:34:19

+0

我見過很多情況下,MySQL爲子查詢結果創建了一個臨時表(沒有索引),導致了嵌套循環的慢連接。其他時候,它將外部查詢與內部查詢嚴重合並,併爲外部查詢中的每一行運行內部查詢。閱讀MySQL手冊的「優化子查詢」部分,瞭解優化器對子查詢的有限性。 – 2010-12-16 00:41:27

+0

我想我已經明白了:) SELECT GROUP_CONCAT(tags.tagWord SEPARATOR',')FROM(SELECT u。* tagWords.tagWord FROM platform.usersProfilesTags爲u INNER JOIN platform.tagWords ON tagWords.tagId = u.tagId 其中userid = 1001)作爲標籤 – 2010-12-16 00:42:14