大表上的MYSQL低效计数

大表上的MYSQL低效计数

我有一个具有这种结构的表:

id(int), aff_id(int)


如果用户未与任何人建立联系并直接注册,则字段aff_id0;如果用户被其他某个玩家建立了联系,则字段larger than 0aff_id > 0,在这种情况下,字段为[cc]。

user #47 was affiliated by user #55, therefore in the database,
we will have this entry: id=47,aff_id=55


我想看看有多少用户做得很好,并与其他用户建立了联盟/合作关系(基本上我想看看有多少用户是联盟会员)。为此,我需要遍历每个用户,看看是否有人在aff_id字段内具有其用户ID。
我不想看到有多少用户拥有,因为这是基本内容,它意味着要关联多少玩家。

根据我的要求,我运行以下查询:

SELECT
COUNT(*),
(SELECT COUNT(*)
FROM `users`
WHERE `aff_id`=`u`.`id`
) AS total_pl
FROM `users` u
HAVING total_pl>0


问题是,在具有2000个条目的数据库上,查询大约需要30秒。

如果我尝试其他方式,则需要花费更多时间...大约40秒:

SELECT
  COUNT(*)
FROM `users` u
WHERE u.id IN (
  SELECT DISTINCT (`aff_id`)
  FROM users
  WHERE aff_id<>0
)


您还建议我尝试其他哪些方法进行优化?

我正在考虑修改第一个查询,以停止计算每个用户有多少个附属玩家,而仅在每个用户有0个附属玩家或至少一个附属玩家的情况下才查找,但似乎没有任何区别。

最佳答案

那呢:

SQL Fiddle

MySQL 5.5.32模式设置:

CREATE TABLE users
    (`id` int, `aff_id` int)
;

INSERT INTO users
    (`id`, `aff_id`)
VALUES
    (47, 55),
    (48, 0),
    (49, 55),
    (50, 56),
    (51, 56),
    (53, 57)
;


查询1:

SELECT COUNT(distinct aff_id)
FROM users
WHERE aff_id <> 0


Results

| COUNT(DISTINCT AFF_ID) |
|------------------------|
|                      3 |


这会给你你想要的

“我想查看有多少用户做得很好,并与其他用户建立了联盟/引进(基本上我想看到有多少用户是联盟成员)”

关于php - 大表上的MYSQL低效计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28840473/

10-11 13:38