2011-06-16 63 views
2

我在MySQL數據庫中有兩個整數列的表格,例如:SQL查詢找到兩個特定組中的用戶數

userid | groupid
10 | 300
11 | 300
11 | 301
12 | 302

給定兩個groupid,我正在尋找最好和最快的方法來找到兩個組中的userid。我的表格包含23M行,我需要爲每個不同的組對。目前,兩列都被編入索引,但即使對於一對組,也需要很長時間才能得到結果,而且我有1000個不同的組別。我現在正在運行的查詢是:

select count(t2.userid) 
from usergroup t1, usergroup t2 
where t1.groupid = 27 and t2.groupid = 714 and t1.userid = t2.userid 

有沒有辦法快速做到這一點?

+1

define indexed?你有什麼指標。 – 2011-06-16 00:47:08

+0

那麼當我發送創建方案到SQL編輯器的索引定義是: KEY'uindex'('userid'), KEY'gindex'('groupid') – Nasir 2011-06-16 00:50:56

+0

如果你覆蓋你的索引,你會得到更好的性能。用(groupid,userid)創建一個唯一的索引 – 2011-06-16 01:00:17

回答

2

爲什麼加入?

select 
    u.userid 
from 
    usergroup u 
where 
    u.groupid in (27, 714) 
group by 
    u.userid 
having 
    count(u.userid) > 1 

假設用戶標識和組識別符號的組合是獨特的,這是我算起來應該是在像這樣的表。

+0

這看起來不錯。只有一件事。我怎麼能計數自使用計數(u.userid)將輸出1爲每個用戶ID(因爲羣) – Nasir 2011-06-16 01:15:02

+0

以及它現在解決了。謝謝 – Nasir 2011-06-16 01:20:41

+0

你不需要。 'having'確保只有用戶返回多於一個(=兩個)組。 – GolezTrol 2011-06-16 05:45:47

0

它對我來說看起來是正確的方法,但創建預準備語句可能會更快。例如 查看下面的帖子。

How can I prevent SQL injection in PHP?

+0

準備好的語句在MySQL中並不快。直到最近他們甚至在哪裏放慢。 – GolezTrol 2011-06-16 00:53:55

0

我認爲這可能是你在找什麼...

select 
    u1.userID 
    from 
     usergroup u1 
     join usergroup u2 
      on u2.groupid = 714 
      AND u1.userid = u2.userid 
    where 
     u1.groupid = 27 

因此,在主WHERE子句只給我組ID = 27中的用戶列表...所以這將是僅在GROUP ID上進行優化。然後,通過對由相同用戶ID和組ID = 714匹配的用戶組表進行自加入,它將僅在發現此類IS時才返回記錄。我可以有兩個組和用戶一個複合索引,如

KEY GroupUser(組識別,用戶ID)

所以這樣的指數,才能既爲查詢組件進行優化......

頂多它將通過第一個u1實例一次爲組中的每個人27 ...沒有計數或涉及...