2011-06-16 69 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 ...没有计数或涉及...