gpt4 book ai didi

mysql - 添加 GROUP BY 如何使此查询更高效?

转载 作者:行者123 更新时间:2023-11-29 01:58:48 26 4
gpt4 key购买 nike

我不明白 mysql 对以下两个查询的 EXPLAIN 输出。

在第一个查询中,mysql 必须首先选择 1238264 条记录:

explain select
count(distinct utc.id)
from
user_to_company utc
inner join
users u
on utc.user_id=u.id
where
u.is_removed=false
order by
utc.user_id asc limit 20;

+----+-------------+--------+------+----------------------------+---------+---------+---------------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+----------------------------+---------+---------+---------------------------------+---------+-------------+
| 1 | SIMPLE | u | ALL | PRIMARY | NULL | NULL | NULL | 1238264 | Using where |
| 1 | SIMPLE | utc | ref | user_id,FKF513E0271C2D1677 | user_id | 8 | u.id | 1 | Using index

在第二个查询中,添加了一个GROUP BY,这使得 mysql 只选择 20 条记录:

explain select
count(distinct utc.id)
from
user_to_company utc
inner join
users u
on utc.user_id=u.id
where
u.is_removed=false
group by
utc.user_id
order by
utc.user_id asc limit 20;

+----+-------------+--------+--------+----------------------------+--------------------+---------+-------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+--------+----------------------------+--------------------+---------+-------------------------+------+-------------+
| 1 | SIMPLE | utc | index | user_id,FKF513E0271C2D1677 | FKF513E0271C2D1677 | 8 | NULL | 20 | Using index |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 8 | utc.user_id | 1 | Using where |
+----+-------------+--------+--------+----------------------------+--------------------+---------+-------------------------+------+-------------+

有关更多信息,users 表中有 1333194 条记录,user_to_company 表中有 1327768 条记录。

添加 GROUP BY 如何让 mysql 在第一次通过时只选择 20 条记录?

最佳答案

第一个查询必须读取所有数据以找到 utc.id 的所有值。它只返回一行,这是整个表的摘要。因此,它必须生成所有数据。

第二个查询为每个 utc.user_id 生成一个单独的总数。您有一个 limit 子句和一个关于 utc.user_id 的索引。显然,MySQL 足够聪明,可以识别它可以转到索引以获取 utc.user_id 的前 20 个值。它使用这些来生成计数。

令我惊讶的是 MySQL 足够聪明来执行此操作(尽管逻辑记录得很好 here )。但是,第二个查询可以在第一个查询无法优化的情况下以这种方式进行优化,这是完全合理的。

关于mysql - 添加 GROUP BY 如何使此查询更高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20753199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com