我有一个具有这种结构的表:
id(int), aff_id(int)
字段 aff_id
是 0
如果用户没有隶属于任何人并且他直接注册,或者 大于 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 个附属玩家或至少 1 个附属玩家,但似乎没有任何区别.
最佳答案
那这个呢:
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/