![](/img/trans.png)
[英]MySql not allow to insert full date in datetime field in version 5.7.*
[英]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);
我可以使用子查询解决相同的问题。 但是我需要知道是按组分组然后是子查询,如果是,那为什么呢?
MySQL将使用它来优化您的分组依据。 如果您想要所有国家/地区的计数,这是最快的选择。 如果您只想计算一个或几个国家/地区的数量,它也是最快的。
不要使用子查询,例如:
SELECT c.country_id, (SELECT count(*) FROM users u WHERE u.country_id=c.country_id)
FROM countries c
这是更多的工作,因为必须针对每个国家/地区执行子查询。 这在这里没有优势。
在这种情况下,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.