注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。
,本质都是统计满足条件的行数的: select count(*) from `user` select count(1) from `user` select count(1) from `user...column是建了索引的,那么速度会比没有建立索引的快很多 4.使用count(column)时,一定要注意思考业务逻辑,比如说,查询user表中一共有多少人: 很多人上来就 select count...select count(*) from `user` 这是查询这张表中user_name不为空的行数。...select count(user_name) from `user` 这是查询这张表中,user_name有多少不重复的行,null的也会被统计为一行。...select count(distinct(user_name)) from `user` 以上数据,是在mysql数据库,100万条数据,200万条数据,和300万条数据下做出验证的。
在 MySQL 中,COUNT 函数是一个非常常用的聚合函数,它用于计算某列或某表达式在查询结果中出现的次数。...但需要注意的是,只有在表没有 WHERE 子句和 GROUP BY 子句时,才能使用这种优化方式。...除此之外,还有一个需要注意的地方,就是在某些数据库中,COUNT(字段) 可能比 COUNT(1) 更快。...综上所述,我们可以得出以下结论:当查询的表中不存在 WHERE 子句和 GROUP BY 子句时,COUNT(*) 可能比 COUNT(主键id) 稍微快一点。...在一些数据库中,COUNT(字段) 可能比 COUNT(1) 更快。因此,在实际应用中,我们可以根据具体的情况来选择不同的写法,从而获得更好的查询性能。
看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非空啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...但是这种需要专门优化的情况太多了,而且MySQL已经优化过count(*)了,你直接使用这种用法就可以了。...我们提到了在不同引擎中count(*)的实现方式是不一样的,也分析了用缓存系统来存储计数值存在的问题。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。...而把计数值也放在MySQL中,就解决了一致性视图的问题。 InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。
今天有人跟我讲 MySQL 中 count(1) 比 count(*) 快,这能忍?必须得和他掰扯掰扯。 声明:以下讨论基于 InnoDB 存储引擎,MyISAM 因为情况特殊我在文末会单独说一下。...3.2 原理分析 不知道小伙伴们有没有注意过,我们学习 MySQL 的时候,count 函数是归在聚合函数那一类的,就是 avg、sum 等,count 函数和这些归在一起,说明它也是一个聚合函数。...最后再来说说 select count(*) from user; ,这个 SQL 的特殊之处在于它被 MySQL 优化过,当 MySQL 看到 count(*) 就知道你是想统计总记录数,就会去找到一个最小的索引树去遍历...可能有小伙伴知道,MyISAM 引擎中的 select count(*) from user; 操作执行起来是非常快的,那是因为 MyISAM 把表中的行数直接存在磁盘中了,需要的时候直接读取出来就行了...当然,MySQL 中的 MVCC 实际上是一个非常宏大的话题,松哥以后有空了再和大家详细介绍 MVCC。 好啦,现在小伙伴们懂了吧?有问题欢迎留言讨论。
假如有如下数据: 所有记录 统计行的总数 计算 Zara 的记录数 count(1)、count() 都是检索表中所有记录行的数目,不论其是否包含null值。...count(1)比count()效率高。 count(字段)是检索表中的该字段的非空行数,不统计这个字段值为null的记录。...从执行计划来看,count(1)和count()的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些(1w以内数据量),不过差不了多少。...count(1) and count(字段) count(1) 会统计表中的所有的记录数,包含字段为null 的记录 count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。...实例 select name, count(name), count(1), count(*), count(age), count(distinct(age)) from counttest group
COUNT() 函数作用是统计符合查询条件的记录中,函数指定的参数不为 NULL 的记录有多少个。...在通过 COUNT 函数统计有多少条记录时,MySQL 的 server 层会维护一个名叫 count 的变量。...那么,InnoDB 循环遍历聚簇索引(主键索引),将读取到的记录返回给 server 层,但是不会读取记录中的任何字段的值,因为 COUNT 函数的参数是 1,不是字段,所以不需要读取记录中的字段值。...COUNT(*) 其实等于 COUNT(0),也就是说,当你使用 COUNT(*) 时,MySQL 会将 * 参数转化为参数 0 来处理。...第二种:额外表保存表记录数 如果是想精确的获取表的记录总数,我们可以将这个计数值保存到单独的一张计数表中。 当我们在数据表插入一条记录的同时,将计数表中的计数字段 + 1。
经常会看到这样的例子: 当你需要统计表中有多少数据的时候,会经常使用如下语句 SELECT COUNT(*) FROM demo_info; 由于聚集索引和非聚集索引中的记录是一一对应的,而非聚集索引记录中包含的列...如果我们使用非聚集索引执行上述查询,即统计一下非聚集索引uk_key2中共有多少条记录,是比直接统计聚集索引中的记录数节省很多I/O成本。所以优化器会决定使用非聚集索引uk_key2执行上述查询。...详情可见MySQL查询为什么选择使用这个索引?...——基于MySQL 8.0.22索引成本计算 分析一下执行计划 在执行上述查询时,server层会维护一个名叫count的变量,然后: server层向InnoDB要第一条记录。...InnoDB找到uk_key2的第一条二级索引记录,并返回给server层(注意:由于此时只是统计记录数量,所以并不需要回表)。 由于count函数的参数是*,MySQL会将*当作常数0处理。
BY name 你应该很容易知道运行的结果,没错,就是下表2: 可是为了能够更好的理解“group by”多个列“和”聚合函数“的应用,我建议在思考的过程中,由表1到表2的过程中,增加一个虚构的中间表...2.FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行...(1)如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,那么id跟number会返回各自单元格中的排序第一个值。...为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。 (3)那么对于id和number里面的单元格有多个数据的情况怎么办呢?...答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如count(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。
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用法总结,如需转载请注明出处
在昨天的一篇闲聊《说说心里话》中,提到了面试中经常会被面试官问到的一个知识点:MYSQL中count(*)、count(1)、count(col)之间的差异;无论是面试开发岗,还是运维岗,这个问题被面试的几率是非常的大...通过上面三个执行计划对比发现: 在MYISAM表中,当表中没有主键和索引的时候,count(*)和count(1)的结果都是一样的,Extra列输出了”Select tables optimized away...通过上面四个执行计划对比发现: 在MYISAM表中,当表中只有主键的时候,count(*)和count(1)的效果都是一样的;但是count(col)出现了区别,也就是: 如果col是主键,那么count...通过上面四个执行计划对比发现: 在INNODB表中,当表中只有主键的时候,count(*)和count(1)、count(主键列)的效果都是一样的,都会走主键索引;count(普通列)如果col是普通列...如下是MYSQL官方文档中相关的描述:https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count COUNT
方法一: 思路:使用group by分组,再用count计算每组的个数,最后用having比较计算后的值大于1的数据。 ...select PRODUCT_CODE from TM_CIS_REQ_PRD_HIS_COUNT group by PRODUCT_CODE,CREDIT_ORG_CODE...,REQ_DATE having count(REQ_DATE)>1 方法二: 思路:使用group by分组,再用count计算每组的个数,放到临时表...dd中,最后用where筛选出大于1的 select PRODUCT_CODE from (select count(REQ_DATE) as product from TM_CIS_REQ_PRD_HIS_COUNT... group by PRODUCT_CODE,CREDIT_ORG_CODE,REQ_DATE) as dd
count(1) count(*) 两者的主要区别是 count(1) 会统计表中的所有的记录数,包含字段为null 的记录。...count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。...count(*) 和 count(1)和count(列名)区别 count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候...,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
它们的区别如下: COUNT(1):在COUNT函数中使用1作为参数,表示统计行数。这种写法不会对具体的列进行操作,只会对行数进行计数。它会忽略列中的NULL值,只统计非NULL的行数。...与COUNT(1)不同的是,COUNT()会统计包括NULL值在内的所有行数,包括那些全部列值为NULL的行。...由于需要考虑NULL值,因此相对于COUNT(1),COUNT()的性能可能稍低一些。 COUNT(列名):在COUNT函数中使用具体的列名作为参数,表示统计该列的非NULL值的数量。...关键点:COUNT(1)和COUNT()用于统计行数,COUNT(1)忽略NULL值,而COUNT()包括NULL值。COUNT(列名)用于统计指定列的非NULL值的数量。...在实际使用中,应根据具体需求选择适当的写法。如果只关注行数而不涉及具体列的操作,常用COUNT(1)或COUNT(*);如果需要统计特定列的非NULL值数量,则使用COUNT(列名)。
group_concat()函数的参数是可以直接使用order by排序的。666。。下面通过例子来说明,首先看下面的t1表。 ?...比如,我们要查看每个人的多个分数,将该人对应的多个分数显示在一起,分数要从高到底排序。...可以这样写: SELECT username,GROUP_CONCAT(score ORDER BY score DESC) AS myScore FROM t1 GROUP BY username;
在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服务
——于是可以指定参数之间的分隔符的concat_ws()来了!!! ?...三、group_concat()函数 前言:在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。...例5:查询该数据并根据性别分组: select sex, id, username from my_test group by sex; ?...——使用group_concat() 例6:查询数据分组并获取每个组别中详细的数据: select sex, group_concat(id) as ids, group_concat(username...) as names from my_test group by sex; ?
count(1)真的比count(*)快那么多吗?count(1)和count(*)的区别究竟在哪里?接下来我们就来一一揭晓。...,count(1)比count(*)快很多,可能只是因为读内存和读磁盘造成的错误印象。...(1)首先看看执行计划,均走的是k_1索引 mysql> explain select count(*) from sbtest1; +----+-------------+---------+----...(*)和count(1)的执行计划相同,profile消耗也相同 (5)翻阅MySQL官方文档(5.6和5.7),也可以找到说明,count(*)和count(1)是一模一样的,没有性能差异 InnoDB...总结 count(*)和count(1)的执行效率,是一样的;网上流传的一些优化原则,已经是不适用于当前版本,要注意及时更新自己的知识库。
领取专属 10元无门槛券
手把手带您无忧上云