首页 > 其他分享 >count(*),count(1),count(字段)

count(*),count(1),count(字段)

时间:2023-12-08 10:44:06浏览次数:38  
标签:count 行数 索引 InnoDB MyISAM TYPE

为什么阿里巴巴禁止使用 count(列名)或 count(常量)来替代 count(*)-阿里云开发者社区 (aliyun.com)
1.关于数据库中统计行数,无论是MySQL还是Oracle,都有只有一个函数可以使用,就是count
count(*) :统计的结果中,包含值为NULL的行数,
count(1):统计的结果中,包含值为NULL的行数
count(字段):统计的结果中,不包含为NULL的行数
2.除了查询得到的结果集有区别之外,count(*)相比于count(1)和count(字段)来讲,count(*) 是SQL92定义的标准统计行数的语法,因为他是标准语法,所以mysql数据库对它进行过很多优化。
那count(*)进行了哪些优化呢?
针对不同的执行引擎,mysql中比较常用的执行引擎是InnoDB和MyISAM。
MyISAM不支持事务,MyISAM中的锁是表级锁,InnoDB支持事务,并且支持行级锁
因为MyISAM的锁是表级锁,所以同一张表上面的操作就需要串行进行,所以,MyISAM做了一个简单的优化,把表的总行数单独记录下来,如果从一张表使用count(*)进行查询的时候,可以直接返回这个记录下来的数值,但是不能有where条件。MyISAM之所以可以把表中的总行数记录下来供count(*)查询使用,是因为MyISAM数据库是表级锁,不会有并发的数据库行数修改,所以查询到的行数是准确的。
但是对于InnoDB来说,就不能做这种缓存操作了,因为InnDB支持事务,其中大部分操作都是行级锁,所以表的行数可能会被并发修改,那么缓存记录下来的行数就不准确了。
所以InnoDB针对count(*)做的优化是:在InnoDB中使用count(*)查询数据的时候,不可避免的要进行扫表了。从MySQL 8.0.13开始,针对InnoDB中的select count(*) from table_name,在表中做了些优化,前提也是查询语句中不包含where和group by等条件。count(*)在扫表的过程中,选择一个成本较低的索引进行的话,可以大大节省时间。
聚族索引中保存的是整行记录,非聚族索引中的叶子节点中保存的是该行记录的主键的值,所以非聚族索引会比聚族索引小很多,所以mysql会优先选择最小的非聚族索引来扫表,所以建表的时候,除了主键索引之外,创建一个非聚族索引也很有必要。
3.count(*)和count(1) ,mysql的优化是完全一样的,根本不存在谁比谁快,建议使用count(*),
count(字段)的查询比较粗暴,就是要进行全表扫表,然后判断字段是不是为null,不为null则累加,所以多了一个检查null的步骤,所以性能比count(*) 慢。

学完上面的突然想到上次工作中碰到的一个问题。
select count(1)  from 360_fzcl_001
GROUP BY PUR_GRP,PO_YEAR,MAT_TYPE,ORDER_TYPE,SEASONS,CHANNEL_TYPE,VENDOR_NAME,SOURCE_P_CODE,MAT_F1_DISPLAY,CY_VENDOR_NAME

select count(distinct m.`PUR_GRP`, m.`PO_YEAR`, m.`MAT_TYPE`, m.`ORDER_TYPE`, m.`SEASONS`, m.`CHANNEL_TYPE`, m.`VENDOR_NAME`, m.`SOURCE_P_CODE`, m.`MAT_F1_DISPLAY`, m.`CY_VENDOR_NAME`) as recordsTotal from `360_fzcl_001` as m 

这两段SQL查询的行数不太一样。就是因为count(字段) 不统计包含null的数据,所以会比count(1)少一点,但是由于后台代码写死的限定,实现的方式只能使用count(字段),
所以最后的解决办法是建表的时候,让有些字段的值默认不为NULL,而是为空字符串,最后解决了这个问题。

 ps:

 




标签:count,行数,索引,InnoDB,MyISAM,TYPE
From: https://www.cnblogs.com/zhaoxiansheng666/p/17884542.html

相关文章

  • collections.Counter()统计list中出现次数
    要查找lines列表中重复的行并将其打印出来,您可以使用Python的collections.Counter()函数来统计每行出现的次数。然后,遍历统计结果,找出出现次数大于1的行,并打印出来。以下是一个示例代码:importosfromcollectionsimportCounterfile_dir="xxx"withopen(file_dir,"r")......
  • 17-有参转录组实战3-计算readcount和TPM表达量
     #本教程部分文件,来源B站15天入门生物信息教程“https://www.bilibili.com/video/BV1K44y1B7Dg/?spm_id_from=333.337.search-card.all.click&vd_source=19eea84b7c1e944fd3c6b3ccca066ade”#1,先将毛果杨的GFF格式的注释文件转换为GTF格式:condainstallgffreadgffread......
  • 重装vs2022 nuget添加包报错: Unexpected character encountered while parsing value:
    工具--》选项--》Nuget包管理器,点击清除所有Nuget存储 参考文献:关于VSNuGet包无法更新,设置包源映射无效的问题-CSDN博客         微软官方文献 ......
  • SQLC - ERROR: relation "accounts" does not exist
    Copiedtheexampleofsqlc.yamlgeneratedby'sqlcinit'from https://docs.sqlc.dev/en/stable/tutorials/getting-started-postgresql.html#.Changeditasfollowing:version:"2"sql:-engine:"postgresql"queries:&quo......
  • Count Beautiful Substrings II
    CountBeautifulSubstringsIIYouaregivenastring s andapositiveinteger k.Let vowels and consonants bethenumberofvowelsandconsonantsinastring.Astringis beautiful if:vowels==consonants.(vowels*consonants)%k==0,inothert......
  • Atcoder-Countings4
    Atcoder-Countings4[ABC231G]BallsinBoxesProblem有\(n\)个盒子,初始时第\(i\)个盒子内有\(a_i\)个小球,进行\(k\)次操作后,每次操作等概率随机选择一个盒子放入一个小球,设\(k\)次操作后每个盒子的小球个数为\(b_i\),那么得分为\(\prod_{i=1}^nb_i\)。求出期望得分......
  • [ABC329C] Count xxx 题解
    插曲因为本人看错了题面,买看到一个子串只包含一种字母,所以切完D和E才回来发现很简单。问题翻译给你一个长度为\(N\)的字符串\(S\),由小写英文字母组成。求\(S\)的非空子串中有多少个是一个字符的重复。在这里,作为字符串的两个子串是相等的,即使它们是以不同的方式得到......
  • ElasticSearch之cat count API
    读取当前存储的记录的数量。命令样例如下:curl-XGET"https://localhost:9200/_cat/count?v=true&pretty"--cacert$ES_HOME/config/certs/http_ca.crt-u"elastic:ohCxPH=QBE+s5=*lo7F9"执行结果输出如下:epochtimestampcount170074840914:06:490查看帮助,命......
  • MySQL中count()、sum()区别
    1、count0函数里面的参数是列名的的时候,会计算有值项的次数sum(函数里面的参数是列名的时候,会计算列名的值的和。2、两个函数在记录的列名的值为空或者是null时,都不会去统计即count(列名)和sum(列名)都不计入这条记录3、count()可以计算出行数,count(1)也可以计算出行数、1......
  • Java的Integer.bitCount()源码分析
    本文部分参考:https://blog.csdn.net/weixin_42092787/article/details/106607426常规解法对于统计一个32位的二进制数值当中1的数量这个问题,常规解法如下:publicinthammingWeight(intn){intcount=0;for(inti=0;i<32;i++){n......