繁体   English   中英

大表上的MYSQL低效计数

[英]MYSQL inefficient count on large tables

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

id(int), aff_id(int)

如果用户不是任何人的会员,并且他直接注册,则字段aff_id0如果用户是其他玩家的会员,则字段aff_id larger than 0 ,并且在这种情况下,它将取会员的ID值。

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

我想看看有多少用户做得很好,并与其他用户建立了联盟/关系(基本上我想看看有多少用户是联盟成员)。 为此,我需要遍历每个用户,看看是否有人在aff_id字段内具有其用户ID。 我不想看到有多少用户的aff_id > 0 ,因为这是基本的东西,这意味着有多少名玩家附属。

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

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小提琴

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

结果

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

这会给你你想要的

“我想看看有多少用户做得很好,并与其他用户建立了联盟/合作关系(基本上我想看到有多少用户是联盟会员)”

获取每个会员的用户数

看来您真的根本不需要使用id 为什么不只是

SELECT aff_id, count(*) FROM users
WHERE aff_id <> 0 
GROUP BY aff_id

如果那不是您的意思,请更好地解释自己。

SELECT 
  u.id,
  COUNT(aff.id) as aff_num
FROM `users` u 
LEFT JOIN `users` aff 
ON u.id = aff.aff_id
GROUP BY u.id
ORDER BY aff_num DESC
HAVING aff_num>0

这是sqlfiddle,它需要2ms-5ms来对65条记录执行查询。

您可以玩更多。 我非常确定,即使表没有正确索引,使用2000条记录,您也永远不会超过3s。

因此,我认为我的查询速度非常快,并且有证明。

你有你的吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM