php - MYSQL 对大表的低效计数

标签 php mysql

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

id(int), aff_id(int)

字段 aff_id0 如果用户没有隶属于任何人并且他直接注册,或者 大于 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 个附属玩家,但似乎没有任何区别.

最佳答案

那这个呢:

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/

相关文章:

php - 使用子字符串 PHP 在页面上显示 SQL 表中的 "Date"数据类型

PHP简单HTML DOM解析器如何仅从第一个表获取TR

php - 如何在 MySQL 的单个查询中选择所有具有 main_category_name 和 parent_id 的 sub_category 记录?

mysql - 如何组合 2 个 SQL 查询以获得 1 个结果

php - 将 2 个查询中的 2 个条件数组合并到 1 个查询中

php - php中的多个 session 问题

php - 存储公式的 MySQL/PHP

PHP pam_auth 和 cookies

php - 类似于 C++ 的 PHP 类模板

mysql - goroutine 中的数据库调用失败而没有错误