元旦前一周到现在总共接到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
MySQL中distinct和group by去重的区别 在MySQL中,我们经常需要对查询结果进行去重,而DISTINCT和GROUP BY是实现这一功能的两种常见方法。...; 聚合函数+去重 使用DISTINCT+聚合函数计算aid去重之后的总条数: SQL代码: SELECT COUNT(DISTINCT aid) FROM pageview; GROUP BY使用 GROUP...: SQL代码: SELECT aid, COUNT(*) FROM pageview GROUP BY aid; distinct和group by的区别 查询结果集不同 使用DISTINCT去重时,...性能不同 如果去重的字段有索引,那么GROUP BY和DISTINCT都可以使用索引,此情况下它们的性能是相同的。...而当去重的字段没有索引时,DISTINCT的性能可能会高于GROUP BY,因为在MySQL 8.0之前,GROUP BY有一个隐藏的功能会进行默认的排序,这样就会触发filesort从而导致查询性能降低
前言 相信大多数DBA都看见过这样一条SQL优化原则:用count(1)替换count(*);相信也有不少DBA因这个问题被开发diss过,用count(*)非常慢,应该用count(1),然后改用count...count(1)真的比count(*)快那么多吗?count(1)和count(*)的区别究竟在哪里?接下来我们就来一一揭晓。...(*)和count(1),耗时均稳定在1.5s左右,因为都是从buffer pool读取数据 mysql> select count(*) from sbtest1; +----------+ | count...那么count(*)和count(1)究竟有没有区别呢?接下来我们继续分析。...(*)和count(1)的执行计划相同,profile消耗也相同 (5)翻阅MySQL官方文档(5.6和5.7),也可以找到说明,count(*)和count(1)是一模一样的,没有性能差异 InnoDB
背景 需要将商品表中的sku按照spu_id分组后,并且得到每个spu下的sku_id,需要使用到group_concat函数 select spu_id, count(*), group_concat...(id SEPARATOR ', ') as ids from product_sku where category = 'tv' group by spu_id; group_concat函数 group_concat...函数,实现分组查询之后的数据进行合并,并返回一个字符串结果,语法如下 group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator...‘分隔符’] 1> 通过使用distinct可以排除重复值; 2> 可以使用order by子句对结果中的值进行排序; 示例: select spu_id, count(*), group_concat...而MySql默认的最大拼接长度为1024个字节,一般情况下是够用的,但如果数据量特别大,就会存在java层返回内容被截断的问题,这时,为了保证拼接数据的完整性,就需要手工修改配置文件的group_concat_max_len
从执行计划来看,count(1)和count()的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些(1w以内数据量),不过差不了多少。...所以没必要去count(1),用count(),sql会帮你完成优化的 因此:count(1)和count(*)基本没有差别!...count(*) 和 count(1)和count(列名)区别 执行效果上: count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,...执行效率 列名为主键,count(列名)会比count(1)快 列名不为主键,count(1)会比count(列名)快 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count()...实例 select name, count(name), count(1), count(*), count(age), count(distinct(age)) from counttest group
在select count(?) from t这样的查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法的性能,有哪些差别。...但是这种需要专门优化的情况太多了,而且MySQL已经优化过count(*)了,你直接使用这种用法就可以了。...我们提到了在不同引擎中count(*)的实现方式是不一样的,也分析了用缓存系统来存储计数值存在的问题。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。...而把计数值也放在MySQL中,就解决了一致性视图的问题。 InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。
在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。...往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表扫描。而实际上如何写Count并没有区别。 ...Count(1)和Count(*)实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。...比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。
Mysql 函数concat、concat_ws和group_concat 本文介绍的是MySQL中3个函数的使用,主要是针对字符串的连接合并处理: concat concat_ws group_concat...合起来就是分组连接,具体语法为: GROUP_CONCAT(DISTINCT expression ORDER BY expression SEPARATOR sep); DISTINCT子句用于在连接分组之前消除组中的重复值...> select s_id, group_concat(distinct s_score order by s_score desc separator "+") from Score group by...s_score表示对分数去重,取出每个学生的不同分数(表中每个学生的分数都不相同,结果同上) mysql> select s_id, group_concat(distinct s_score order...和order by 后面的字段是相同的
当项目里面使用paginate()函数进行分页,并且使用了distinct函数进行去重 这个时候自动查询的count语句并没有增加distinct语句 需要指定好字段,这样就可以解决这个问题了 例如 -...>distinct("xxxx.id");
在使用group_concat的过程中遇到个问题,这里记录一下:在MySQL中有个配置参数group_concat_max_len,它会限制使用group_concat返回的最大字符串长度,默认是1024...可以通过修改MySQL(my.ini)配置文件来彻底解决这个问题。 方法二: 修改MySQL(my.ini)配置文件,需要重启服务器后才能生效。
在 MySQL 中,COUNT 函数是一个非常常用的聚合函数,它用于计算某列或某表达式在查询结果中出现的次数。...但是,在实际使用过程中,我们可能会遇到不同的 COUNT 函数写法,比如 COUNT(*)、COUNT(主键id)、COUNT(字段) 和 COUNT(1),这些写法在效率上有何差别呢?...本文将详细探讨这个问题。COUNT(*) 与 COUNT(主键id)首先,我们来看 COUNT(*) 与 COUNT(主键id) 这两个写法的区别。...但是,如果在多表查询的情况下使用 COUNT(1) 或 COUNT(字段),就需要注意它们的性能问题了。在这种情况下,MySQL 必须进行联接操作,然后再统计记录数。...在单表查询时,COUNT(1) 和 COUNT(字段) 的性能通常相同,因为它们使用的优化方案也相同。在多表查询时,COUNT(1) 通常比 COUNT(字段) 更快。
count COUNT()函数里面的参数是列名的的时候,那么会计算有值项的次数。...(NULL 不计入, 但是''值计入) COUNT(*)可以计算出行数,包括null COUNT(1)也可以计算出行数,1在这里代表一行 COUNT(column)对特定的列的值具有的行数进行计算,不包含...NULL值 COUNT(条件表达式),不管记录是否满足条件表达式,只要非NULL就加1 ,所以一般都count(id=1 or null) sum sum()参数是列名的时候,计算列名的值的相加,不是统计有值项的总数...sum(id=2) 当参数是表达式的时候,统计满足条件的行数 注: 上面id指列名,=后面的代表值 本文参考:MySQL中sum和count用法总结,如需转载请注明出处
distinct 当一个字段含有很多相同的内容时,我们可以用distinct来将别的相同信息筛选掉,具体的命令是: select distinct xx from 你要查询的表; where (1)where...后面可以跟各种比较运算符和逻辑运算符,>、=、and、or、not。。。...(3)where后面还可以跟between和and字段 ?
注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。
在mysql中的group_concat函数默认支持的最大字符数为1024。 当你使用group_concat函数时,超出第1024字符的字符会全部丢失。 今天就被这个问题搞了一两个小时。...不使用group by和group_concat时数据是正确的。 一用就发现使用了group_concat函数的列少了一些数据。..."; 一看自己的mysql中group_concat的最大限制 发现等于1024 解决方法: 1.使用sql设置group_concat的最大长度 SET GLOBAL group_concat_max_len...=102400; SET SESSION group_concat_max_len=102400; 但是这种方式在重启mysql后就无效。...2.在MySQL配置文件中my.conf或my.ini中添加: #[mysqld] group_concat_max_len=102400 然后重启mysql服务
官方文档 https://dev.mysql.com/doc/ ?...如果英文不好的话,可以参考 searchdoc 翻译的中文版本 http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114...---- 优化的原因 MySQL-Btree索引和Hash索引初探 中 什么情况下会使用到B树索引 。...not int 和 操作无法使用索引 ---- not in 的优化 如果not in 的指标范围非常大的话,这个效率很差。...---- 使用汇总表优化count(*)查询 select count(*) from product_comment where product_id = 999; 如果这个表 有上亿条,或者并发访问很高的情况
常用的组函数: AVG([distinct] expr) 求平均值 COUNT({*|[distinct] } expr) 统计行的数量 MAX([distinct] expr) 求最大值 MIN([distinct...] expr) 求最小值 SUM([distinct] expr) 求累加和 ①每个组函数接收一个参数 ②默认情况下,组函数忽略列值为null的行,不参与计算 ③有时,会使用关键字distinct...4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...,则可以合并group by和order by子句 mysql> select teamno,count(*) -> from MATCHES -> group by teamno...例1:对于每个球队,得到其编号和所有球员的编号 mysql> select teamno,group_concat(playerno) -> from MATCHES -> group
领取专属 10元无门槛券
手把手带您无忧上云