与count(distinct)都是很常见的操作。...count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都能明白什么意思。...count(distinct colA)的操作也可以用group by的方式完成,具体代码如下: select count(distinct colA) from table1; select count...group by的实现方式是先将colA排序。...总结起来就是,count(distinct)吃内存,查询快;group by空间复杂度小,在时间复杂度允许的情况下,可以发挥他的空间复杂度优势。
日常统计场景中,我们经常会对一段时期内的字段进行去重并统计数量,SQL语句类似于 SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...; 这条语句是从一个表的符合...这唯一的Reduce Task需要Shuffle大量的数据,并且进行排序聚合等处理,这使得它成为整个作业的IO和运算瓶颈。...原来Hive在处理COUNT这种全聚合(full aggregates)计算时,会忽略用户指定的Reduce Task数,而强制使用1。我们只能采用变通的方法来绕过这一限制。...改进后的SQL语句如下: SELECT COUNT(*) FROM ( SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t; 在实际运行时,我们发现...从上述优化过程我们可以看出,一个简单的统计需求,如果不理解Hive和MapReduce的工作原理,它可能会比优化后的执行过程多四、五倍的时间。
聚合函数 在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。...DepartmentID as '部门名称', COUNT(*) as '个数' from BasicDepartment group by DepartmentID 这个就是使用了group...HAVING子句可以使用聚合函数 WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前....WHERE字句中不能使用聚合函数 举例说明: 一、显示每个地区的总人口数和总面积....; 使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
1、效果上: count(1)忽略所有列,用1代表行,不会忽略为NULL列。 count(*)含所有列,不会忽略为NULL列。...count(列名)只含列名那列,忽略列值为null的计数,而不忽略空字符串或者0,即某个字段值为NULL时,不统计。 2、效率上: 若列名是主键,count(列名)比count(1)快。...若列名不是主键,count(1)比count(列名)快。 若多个列没有主键,则 count(1)效率优于 count(*)。...若存在主键,则 select count(主键)的执行效率是最优的 。 若表只有一个字段,则 select count(*)最优。
count(*) 性能与存储引擎相关 我们都知道,MySQL 常见的存储引擎有两种:MyISAM 和 InnoDB。...count(1) 和 count() 对比 当表的数据量大些时,对表作分析之后,使用 count(1)还要比使用 count(*)用时多了!...从执行计划来看, count(1) 和 count(*)的效果是一样的。但是在表做过分析之后, count(1) 会比 count(*)的用时少些(1w以内数据量),不过差不了多少。...因为 count(*)自动会优化指定到那一个字段,所以没必要去 count(1),用 count(*) sql会帮你完成优化的,因此:count(1) 和 count(*)基本没有差别!...并不是count(1),所以建议尽量使用 count(*)。
思路就是通过article表来分别join成果product表、user表和project表,然后group里用productid来筛选,最后再用projectid筛选。...err error) { db := GetDB() db.Order("total desc").Table("article").Select("product_id as productid, count...Joins("left JOIN user on user.id = product.uid").Group("product.uid").
)比count(*)快 若表只有一个字段,count(*)最快 count(1)跟count(主键)一样,只扫描主键 count(*)跟count(非主键)一样,扫描整个表 明显前者更快。...执行效果 count(1) V.S count(*) 表数据量大,对表分析后,用count(1)还要比用count()用时多! 执行计划看,count(1)和count(*)效果一样。...因为count(*)会自动优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化。 因此:count(1)和count(*)基本无差。...(name), count(1), count(*), count(age), count(distinct(age)) -> from counttest -> group by name...| count(1) | count(*) | count(age) | count(distinct(age)) | +------+-------------+-----------+-----
注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。...性能对比结论 count(可空字段) count(非空字段) = count(主键 id) count(1) ≈ count(*)
注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。...性能对比结论 count(可空字段) count(非空字段) = count(主键 id) count(1) ≈ count(*) 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
介绍使用索引、临时表 + 文件排序实现 group by,以及单独介绍临时表的三篇文章中,多次以 count(distinct) 作为示例说明。...概述 如果 count(distinct) 不能使用索引去重,就需要使用临时表。临时表的存储引擎有三种选择:MEMORY、MyISAM、InnoDB。...8. sum(distinct)、avg(distinct) 不一样 sum(distinct)、avg(distinct) 也需要去重,但是和 count(distinct) 不一样的地方在于:sum...因此,对于 sum(distinct)、avg(distinct) 来说,只会选择使用红黑树去重,并且也不会创建一个空的 MEMORY 临时表,这两点和 count(distinct) 不一样。...第 8 小节,介绍了 sum(distinct)、avg(distinct) 只能用于整数、浮点数求和、求平均数,它们和 count(distinct) 不一样的地方在于:只会选择使用红黑树去重,不需要创建
在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。...往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。 ...Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。...比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。
最近写了一些SQL,在用count进行统计的时候,我一般都习惯用count(*),看同事的代码有事会用count(1),那么count(*),count(1)和count(某一列)有什么区别呢?...首先从查询结果来看: count(*)和count(1)统计的是整张表的所有行。...count(列):如果统计的列不允许为null,则统计的也是所有行,当这一列有null值时,count将忽略null的行。...于是在自己的数据库里进行测试: 1.4000+数据,查询时间一样,都是0.003 sec 2.14W+数据,count(1): 0.078 sec count...(*): 0.059 sec count(id): 0.067 sec 从结果上来看,是count(*)比较快。
但是,在实际使用过程中,我们可能会遇到不同的 COUNT 函数写法,比如 COUNT(*)、COUNT(主键id)、COUNT(字段) 和 COUNT(1),这些写法在效率上有何差别呢?...但需要注意的是,只有在表没有 WHERE 子句和 GROUP BY 子句时,才能使用这种优化方式。...MySQL 会使用索引或全表扫描统计记录数,对于单表查询的情况,索引扫描通常比全表扫描要快一些。但是,如果在多表查询的情况下使用 COUNT(1) 或 COUNT(字段),就需要注意它们的性能问题了。...综上所述,我们可以得出以下结论:当查询的表中不存在 WHERE 子句和 GROUP BY 子句时,COUNT(*) 可能比 COUNT(主键id) 稍微快一点。...在单表查询时,COUNT(1) 和 COUNT(字段) 的性能通常相同,因为它们使用的优化方案也相同。在多表查询时,COUNT(1) 通常比 COUNT(字段) 更快。
在select count(?) from t这样的查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法的性能,有哪些差别。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...但是这种需要专门优化的情况太多了,而且MySQL已经优化过count(*)了,你直接使用这种用法就可以了。...所以结论是: 按照效率排序的话,count(字段)count(主键id)count(1)≈count(*),所以我建议你,尽量使用count(*)。...InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。
关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT。...至此,我们介绍完了MySQL数据库对于COUNT(*)的优化,这些优化的前提都是查询语句中不包含WHERE以及GROUP BY条件。...所以,对于COUNT(1)和COUNT(*),MySQL的优化是完全一样的,根本不存在谁比谁快! 建议使用COUNT(*)!...主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。...当然,这些优化的前提都是没有进行where和group的条件查询。
结论 https://www.cnblogs.com/sueris/p/6650301.html 这里把上面实验的结果总结一下: count()和count(1)执行的效率是完全一样的。...count()的执行效率比count(col)高,因此可以用count()的时候就不要去用count(col)。...count(col)的执行效率比count(distinct col)高,不过这个结论的意义不大,这两种方法也是看需要去用。...在不加WHERE限制条件的情况下,COUNT()与COUNT(COL)基本可以认为是等价的; 但是在有WHERE限制条件的情况下,COUNT()会比COUNT(COL)快非常多; count(0)=...count(1)=count(*) count(指定的有效值)--执行计划都会转化为count(*) 如果指定的是列名,会判断是否有null,null不计算 当然,在建立优化count的索引之前一定要考虑新建立的索引会不会对别的查询有影响
元旦前一周到现在总共接到9个sparksql相关的优化咨询,这些案例中,有4个和count(distinct)有关。...我们知道sparksql处理count(distinct)时,分两种情况: with one count distinct more than one count distinct 这两种情况,sparksql...如果sql中没有非distinct类的聚合,比如,sql是: select count(distinct a) as a_num, count(distinct b) as b_num...(distinct if(b=1,a,null)) as a_num1, count(distinct if(b=3,a,null)) as a_num2 , count(distinct if(b...max(if(b=1,1,0)) as b1_flag, max(if(b=3,1,0)) as b3_flag, max(if(b=4,1,0)) as b4_flag from testdata2 group
【mysql】count(*)、count(1)和count(column)区别 小结: count(*) 对行的数目进行计算,包含NULL。...count(column) 对特定的列的值具有的行数进行计算,不包含NULL值。 count(1) 这个用法和count(*)的结果是一样的。...网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。...而我在《高性能MySQL》一书中看到这样一段话:当我们使用 count(*) 时,通配符 * 并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。... shop_order # 有主键:0.139s,无主键:0.285s select count(1) from shop_order # 有主键但不使用主键:0.383s (count(普通列))
下班路上看见网上有人问一个问题: oracle 10g以后count(*)和count(非空列)性能方面有什么区别?...前三个均为表数据总量,第四个SQL结果是99999,仅包含非空记录数据量,说明若使用count(允许空值的列),则统计的是非空记录的总数,空值记录不会统计,这可能和业务上的用意不同。...其实这无论id2是否包含空值,使用count(id2)均会使用全表扫描,因此即使语义上使用count(id2)和前三个SQL一致,这种执行计划的效率也是最低的,这张测试表的字段设置和数据量不很夸张,因此不很明显...总结: 11g下,通过实验结论,说明了count()、count(1)和count(主键索引字段)其实都是执行的count(),而且会选择索引的FFS扫描方式,count(包含空值的列)这种方式一方面会使用全表扫描...,另一方面不会统计空值,因此有可能和业务上的需求就会有冲突,因此使用count统计总量的时候,要根据实际业务需求,来选择合适的方法,避免语义不同。