首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL的count(*)、count(1)和count(列名)区别

count(1)比count()效率高。 count(字段)是检索表中的该字段的非空行数,不统计这个字段值为null的记录。...从执行计划来看,count(1)和count()的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些(1w以内数据量),不过差不了多少。...所以没必要去count(1),用count(),sql会帮你完成优化的 因此:count(1)和count(*)基本没有差别!...count(1) and count(字段) count(1) 会统计表中的所有的记录数,包含字段为null 的记录 count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。...count(*) 和 count(1)和count(列名)区别 执行效果上: count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,

3.5K20

MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...至于分析性能差别的时候,记住这么几个原则: server 层要什么就给什么; InnoDB 只给必要的值; 现在的优化器只优化了 count(*) 的语义为“取行数”,其他“显而易见”的优化并没有做。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。

2.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

    注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...至于分析性能差别的时候,记住这么几个原则: server 层要什么就给什么; InnoDB 只给必要的值; 现在的优化器只优化了 count(*) 的语义为“取行数”,其他“显而易见”的优化并没有做...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。

    2.4K10

    性能大PK count(*)、count(1)和count(列)

    印象中网上有些“XX 面试官”系列的网文也有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和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(*)基本没有差别!

    1.6K10

    MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

    但是,在实际使用过程中,我们可能会遇到不同的 COUNT 函数写法,比如 COUNT(*)、COUNT(主键id)、COUNT(字段) 和 COUNT(1),这些写法在效率上有何差别呢?...这里需要注意的是,如果主键是一个自增长列,那么 COUNT(*) 和 COUNT(主键id) 得到的结果是相同的,因为自增长列的值必定不为 NULL。那么,这两种写法的效率如何呢?...COUNT(字段) 表示计算该字段不为 NULL 的记录数,而 COUNT(1) 表示计算所有行数,这里需要注意的是,COUNT(1) 和 COUNT(*) 的作用是相同的。...综上所述,我们可以得出以下结论:当查询的表中不存在 WHERE 子句和 GROUP BY 子句时,COUNT(*) 可能比 COUNT(主键id) 稍微快一点。...在单表查询时,COUNT(1) 和 COUNT(字段) 的性能通常相同,因为它们使用的优化方案也相同。在多表查询时,COUNT(1) 通常比 COUNT(字段) 更快。

    1.4K30

    MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

    在select count(?) from t这样的查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法的性能,有哪些差别。...需要注意的是,下面的讨论还是基于InnoDB引擎的。 这里,首先你要弄清楚count()的语义。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。...而把计数值也放在MySQL中,就解决了一致性视图的问题。 InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。

    4.8K50

    【数据库】count(*),count(1)和count(列)

    最近写了一些SQL,在用count进行统计的时候,我一般都习惯用count(*),看同事的代码有事会用count(1),那么count(*),count(1)和count(某一列)有什么区别呢?...首先从查询结果来看: count(*)和count(1)统计的是整张表的所有行。...count(列):如果统计的列不允许为null,则统计的也是所有行,当这一列有null值时,count将忽略null的行。...接着从查询效率上来看: 网上说法不一,后来请教了公司的DBA,DBA是这么说的:这个具体得看表,结果一样 数据量不大的话,没什么区别,如果数据量大并有主键,count(1)会好一点。...于是在自己的数据库里进行测试: 1.4000+数据,查询时间一样,都是0.003 sec 2.14W+数据,count(1): 0.078 sec count

    79910

    Select count(*)、Count(1)、Count(0)的区别和执行效率比较

    结论 https://www.cnblogs.com/sueris/p/6650301.html 这里把上面实验的结果总结一下: count()和count(1)执行的效率是完全一样的。...count()的执行效率比count(col)高,因此可以用count()的时候就不要去用count(col)。...如果是对特定的列做count的话建立这个列的非聚集索引能对count有很大的帮助。 如果经常count()的话则可以找一个最小的col建立非聚集索引以避免全表扫描而影响整体性能。...在不加WHERE限制条件的情况下,COUNT()与COUNT(COL)基本可以认为是等价的; 但是在有WHERE限制条件的情况下,COUNT()会比COUNT(COL)快非常多; count(0)=...count(1)=count(*) count(指定的有效值)--执行计划都会转化为count(*) 如果指定的是列名,会判断是否有null,null不计算 当然,在建立优化count的索引之前一定要考虑新建立的索引会不会对别的查询有影响

    1.4K20

    MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?「建议收藏」

    在select count(?) from t这样的查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法的性能,有哪些差别。...需要注意的是,下面的讨论还是基于InnoDB引擎的。 这里,首先你要弄清楚count()的语义。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。...而把计数值也放在MySQL中,就解决了一致性视图的问题。 InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。

    1.5K40

    count(*) count(1)与count(col)的区别

    一、执行结果 count(*) 和count(1) 都是统计行数,而count(col) 是统计col列非null的行数 二、执行计划   MyISAM与InnoDB,正如在不同的存储引擎中,count...有主键或联合主键的情况下,count(*)略比count(1)快一些。  没有主键的情况下count(1)比count(*)快一些。  如果表只有一个字段,则count(*)是最快的。...3、count(字段),非主键字段,这样的使用方式最好不要出现,因为它不会走索引。 count(主键ID)比count(1)慢的原因?...从InnoDB引擎层返回ID会涉及到解析数据行、拷贝字段值的操作,因此count(主键 ID)执行要比count(1)执行慢。 count(主键id)走主键索引的时候效率较count(*)差的原因?...但是在做count(*)的时候并没有检索具体的一行或者一个范围,那么选择基数小的索引对count操作效率会更高。在做count操作的时候,mysql会遍历每个叶子节点,所以基数越小,效率越高。

    4.5K21

    select count(*)、count(1)、count(主键列)和count(包含空值的列)有何区别?

    下班路上看见网上有人问一个问题: oracle 10g以后count(*)和count(非空列)性能方面有什么区别?...前三个均为表数据总量,第四个SQL结果是99999,仅包含非空记录数据量,说明若使用count(允许空值的列),则统计的是非空记录的总数,空值记录不会统计,这可能和业务上的用意不同。...其实这无论id2是否包含空值,使用count(id2)均会使用全表扫描,因此即使语义上使用count(id2)和前三个SQL一致,这种执行计划的效率也是最低的,这张测试表的字段设置和数据量不很夸张,因此不很明显...总结: 11g下,通过实验结论,说明了count()、count(1)和count(主键索引字段)其实都是执行的count(),而且会选择索引的FFS扫描方式,count(包含空值的列)这种方式一方面会使用全表扫描...,另一方面不会统计空值,因此有可能和业务上的需求就会有冲突,因此使用count统计总量的时候,要根据实际业务需求,来选择合适的方法,避免语义不同。

    3.4K30

    面试题count(*) 和 count(1)的区别

    那你说说 select count(1) 和 select count(*)的区别吧。 回答:emmmm。。。好像就是查一下总数量,没啥区别吧。...select count(*) from tablea where xxxx=xxx select count(1) from tablea where xxxx=xxx 那为啥会有1和*呢?...举一个例子 id name 1 A 2 b 3 c 4 (null) 那么,select count(1) 和 select count(*) 的结果都是一样的,都是4。...那么讲到这里,还有一个就是count(字段)。 count(字段):他也是算总数,会根据某一个字段去算,排除null的情况。 一般来说,count(*) 和 count(1) ,结果基本一样。...除非你有全是null的结果,不过一般,现在的业务场景很少会出现这种情况。我们一般都会去设置主键,或者设置主键递增。 现在大家应该是清楚了,count的几种情况,

    8510

    浅聊count(1)、count(*) 与 count(列名) 的区别

    简单来说: COUNT(1) 和 COUNT(*) 表示的是直接查询符合条件的数据库表的行数。而 COUNT(列名) 表示的是查询符合条件的列的值不为 NULL 的行数。...)的优化 COUNT(*) 在 MySQL 中的优化与所使用的执行引擎密切相关,常见的执行引擎包括 MyISAM 和 InnoDB。...COUNT(*)和 COUNT(1) MySQL 官方文档对于 COUNT(*)和 COUNT(1) 的性能差异没有做出具体说明。不过,可以从一些实践和理论上推断一些情况。...综上所述,对于 COUNT(*) 和 COUNT(1) 的性能差异,可能取决于具体的情况和 MySQL 的版本。在实际情况中,可以根据具体的需求和环境选择合适的写法。...所以,对于 COUNT(1) 和 COUNT(*),MySQL 的优化是完全一样的,根本不存在谁比谁快! 那既然COUNT(*) 和 COUNT(1)一样,建议用哪个呢? 建议使用 COUNT(*)!

    61010

    count(*)、count(1)和count(column)区别以及执行效率高低比较

    【mysql】count(*)、count(1)和count(column)区别 小结: count(*) 对行的数目进行计算,包含NULL。...count(column) 对特定的列的值具有的行数进行计算,不包含NULL值。 count(1) 这个用法和count(*)的结果是一样的。...执行效率:   它们三个的效率如何呢?网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。...我们发现最常见的错误就是,在括号内指定一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*),这样写意义清晰,性能也会很好。...另外,在 MyISAM 中,count() 函数总是非常快的,不过这也是有前提条件的,即只有没有任何 where 条件的 count(*)才非常快,这是这个引擎的特性。

    3K40
    领券