繁体   English   中英

在mysql 5.7。*中测量group by子句的性能

[英]Measuring Performance of group by clause in mysql 5.7.*

最近,我需要根据该国家/地区的活跃状态来查找Mysql中的所有用户。

表架构为

under.



| Field                   | Type        | Null | Key | Default | Extra |

| country_id              | int(11)     | NO   | PRI | NULL    |       |

| user_id                 | int(11)     | NO   | PRI | NULL    |       |

| uuid                    | varchar(40) | NO   | UNI | NULL    |       |

| active                  | bit(1)      | NO   |     | NULL    |       |

注意:用户可以是多个国家的成员。

我对此计算的查询如下

select count(*) as count,country_id from user_country where active=true group by (country_id);

我可以使用子查询解决相同的问题。 但是我需要知道是按组分组然后是子查询,如果是,那为什么呢?

  • 如果country_id上有一个索引:

MySQL将使用它来优化您的分组依据。 如果您想要所有国家/地区的计数,这是最快的选择。 如果您只想计算一个或几个国家/地区的数量,它也是最快的。

不要使用子查询,例如:

SELECT c.country_id, (SELECT count(*) FROM users u WHERE u.country_id=c.country_id)
FROM countries c

这是更多的工作,因为必须针对每个国家/地区执行子查询。 这在这里没有优势。

  • 如果country_id上没有索引

在这种情况下,MySQL将必须读取整个表并使用按country_id分组的排序。 这比使用索引要慢,但是对于偶尔的报表查询来说,也可以,如果结果被缓存并且您每天运行一次查询,也是如此。

没有索引,使用从属子查询会更糟,因为必须针对每个国家/地区读取和过滤整个表格。 这将是可怕的。

现在,由于user_id和country_id都标记为“ PRI”索引,所以我不知道您的PK是(country_id,user_id)还是相反。 如果是(country_id,user_id),则您已经有一个国家索引。 如果是(user_id,country_id),那么您就不会...这将是一个奇怪的模式,顺便说一句。

暂无
暂无

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

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