精华内容
下载资源
问答
  • count(1)
    千次阅读 多人点赞
    2021-03-17 21:50:29

    今天前,我一直觉得count(1)优先于count(*),但是,今天想知道其缘由,查了一下百度,闪瞎我的双眼。

    从执行结果来说:

            count(1)和count(*)之间没有区别,因为count(*)count(1)都不会去过滤空值,

             但count(列名)就有区别了,因为count(列名)会去过滤空值。

    从执行效率来说:

             他们之间根据不同情况会有些许区别,MySQL会对count(*)做优化。

             (1)如果列为主键,count(列名)效率优于count(1)  

             (2)如果列不为主键,count(1)效率优于count(列名)  

             (3)如果表中存在主键,count(主键列名)效率最优  

             (4)如果表中只有一列,则count(*)效率最优  

              (5)如果表有多列,且不存在主键,则count(1)效率优于count(*)
     

    补充关于count(1)count(*)原理 引用百度知道专业回答

    count(1),其实就是计算一共有多少符合条件的行。

    1并不是表示第一个字段,而是表示一个固定值。

    其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1。

    count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。

     

    原创不易,转载自:https://blog.csdn.net/qq_34696236/article/details/84376507

     

    更多相关内容
  • MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析

    1. 前言

      相信在此之前,很多人都只是记忆,没去理解,只知道count(*)count(1)包括了所有行,在统计结果的时候,不会忽略列值为NULLcount(列名)只统计列名那一列,在统计结果的时候,会忽略列值为NULL的记录。

      下面就从原理上给大家分析一下。


    2. 建表

    和前面一样,用的同一个表,表中有将近10W条数据

    CREATE TABLE demo_info(
        id INT NOT NULL auto_increment,
        key1 VARCHAR(100),
        key2 INT,
        key3 VARCHAR(100),
        key_part1 VARCHAR(100),
        key_part2 VARCHAR(100),
        key_part3 VARCHAR(100),
        common_field VARCHAR(100),
        PRIMARY KEY (id),
        KEY idx_key1 (key1),
        UNIQUE KEY uk_key2 (key2),
        KEY  idx_key3 (key3),
        KEY idx_key_part(key_part1, key_part2, key_part3)
    )ENGINE = INNODB CHARSET=utf8mb4;
    

    3. count是怎么样执行的?

    经常会看到这样的例子:
    当你需要统计表中有多少数据的时候,会经常使用如下语句

    SELECT COUNT(*) FROM demo_info;
    

      由于聚集索引和非聚集索引中的记录是一一对应的,而非聚集索引记录中包含的列(索引列+主键id)是少于聚集索引(所有列)记录的,所以同样数量的非聚集索引记录比聚集索引记录占用更少的存储空间。如果我们使用非聚集索引执行上述查询,即统计一下非聚集索引uk_key2中共有多少条记录,是比直接统计聚集索引中的记录数节省很多I/O成本。所以优化器会决定使用非聚集索引uk_key2执行上述查询

    注意:这里已经验证过了,uk_key2比其他索引成本更低。 详情可见MySQL查询为什么选择使用这个索引?——基于MySQL 8.0.22索引成本计算

    分析一下执行计划

    在执行上述查询时,server层会维护一个名叫count的变量,然后:

    • server层向InnoDB要第一条记录。

    • InnoDB找到uk_key2的第一条二级索引记录,并返回给server层(注意:由于此时只是统计记录数量,所以并不需要回表)。

    • 由于count函数的参数是*MySQL会将*当作常数0处理。由于0并不是NULLserver层给count变量加1

    • server层向InnoDB要下一条记录。

    • InnoDB通过二级索引记录的next_record属性找到下一条二级索引记录,并返回给server层。

    • server层继续给count变量加1

    • 重复上述过程,直到InnoDBserver层返回没记录可查的消息。

    • server层将最终的count变量的值发送到客户端。


    4. count(1),count(id),count(非索引列),count(二级索引列)的分析

    来看看count(1)

    SELECT COUNT(1) FROM demo_info;
    

    执行计划和count(*)一样

      对于count(*)count(1)或者任意的count(常数)来说,读取哪个索引的记录其实并不重要,因为server层只关心存储引擎是否读到了记录,而并不需要从记录中提取指定的字段来判断是否为NULL。所以优化器会使用占用存储空间最小的那个索引来执行查询

    再看一下count(id)

    explain SELECT COUNT(id) FROM demo_info;
    

      对于count(id)来说,由于id是主键,不论是聚集索引记录,还是任意一个二级索引记录中都会包含主键字段,所以其实读取任意一个索引中的记录都可以获取到id字段,此时优化器也会选择占用存储空间最小的那个索引来执行查询

    再看一下count(非索引列)

    explain select count(common_field) from demo_info
    

      对于count(非索引列)来说,优化器选择全表扫描,说明只能在聚集索引的叶子结点顺序扫描。

    请确认你理解了全表扫描,它是顺序扫描聚集索引的所有叶子结点并判断。

      而对于其他二级索引列,count(二级索引列),优化器只能选择包含我们指定的列的索引去执行查询,只能去指定非聚集索引的B+树扫描 ,可能导致优化器选择的索引扫描代价并不是最小。

    综上所述:
      对于count(*)count(常数)count(主键)形式的count函数来说,优化器可以选择扫描成本最小的索引执行查询,从而提升效率,它们的执行过程是一样的,只不过在判断表达式是否为NULL时选择不同的判断方式,这个判断为NULL的过程的代价可以忽略不计,所以我们可以认为count(*)count(常数)count(主键)所需要的代价是相同的。

      而对于count(非索引列)来说,优化器选择全表扫描,说明只能在聚集索引的叶子结点顺序扫描。

      count(二级索引列)只能选择包含我们指定的列的索引去执行查询,可能导致优化器选择的索引执行的代价并不是最小。

      其实上述这些区别就是因为非聚集索引记录比聚集索引记录占用更少的存储空间,减少更多I/O成本,所以优化器才有了不同索引的选择,仅此而已。



    欢迎一键三连~

    有问题请留言,大家一起探讨学习

    ----------------------Talk is cheap, show me the code-----------------------
    展开全文
  • 该章节内容很少,只是针对MySQL - count(字段)、count(主键)、count(1)、count(*)的区别,进行的一个简短的记录。

    🐳 count(字段)、count(主键)、count(1)、count(*)的区别

    • count()是一个聚合函数,对于返回的结果集一行行地判断,如果 count 函数中参数对应的字段值不是 Null,累计值就加 1,否则不加,最后返回累计值。
    • count(*)、count(1)和count(主键 id) 都返回满足条件的结果集的总行数;而 count(字段),则返回字段中值不为 Null 的总行数。

    以weibo_user表为例,表中共有99条数据,created_at字段值不为Null的数据有6条


    • count(*)查询到全部数据

    • count(id)查询到全部数据

    • count(1)查询到全部数据

    • count(create_at)只查询到6条数据,值不为NULL的数据

    🐳 执行效率

    • 如果数据表没有主键,那么count(1)比count()快;
    • 如果有主键,那主键作为count的条件也比count()要快;
    • 如果表只有一个字段,count(*)就是最快的。
    展开全文
  • count(1)、count(*)、count(列名) 详解

    千次阅读 2021-06-01 15:02:41
    1.count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)的...

    一、执行效果:


    1.  count(1) and count(*)

    当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 
    从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。 
     
    如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 
    因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的 因此: count(1)和count(*)基本没有差别! 
     
    2. count(1) and count(字段)
    两者的主要区别是
    (1) count(1) 会统计表中的所有的记录数, 包含字段为null 的记录
    (2) count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即 不统计字段为null 的记录。  
    转自:http://www.cnblogs.com/Dhouse/p/6734837.html


    二、count(*) 和 count(1)和count(列名)区别  

    执行效果上 :  
    count(*)包括了所有的列,相当于行数,在统计结果的时候, 不会忽略列值为NULL  
    count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候, 不会忽略列值为NULL  
    count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数, 即某个字段值为NULL时,不统计

    执行效率上:  
    列名为主键,count(列名)会比count(1)快  
    列名不为主键,count(1)会比count(列名)快  
    如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)  
    如果有主键,则 select count(主键)的执行效率是最优的  
    如果表只有一个字段,则 select count(*)最优。
    转自:http://eeeewwwqq.iteye.com/blog/1972576


    实例分析

    mysql> create table counttest(name char(1), age char(2));
    Query OK, 0 rows affected (0.03 sec)
     
    mysql> insert into counttest values
        -> ('a', '14'),('a', '15'), ('a', '15'), 
        -> ('b', NULL), ('b', '16'), 
        -> ('c', '17'),
        -> ('d', null), 
        ->('e', '');
    Query OK, 8 rows affected (0.01 sec)
    Records: 8  Duplicates: 0  Warnings: 0
     
    mysql> select * from counttest;
    +------+------+
    | name | age  |
    +------+------+
    | a    | 14   |
    | a    | 15   |
    | a    | 15   |
    | b    | NULL |
    | b    | 16   |
    | c    | 17   |
    | d    | NULL |
    | e    |      |
    +------+------+
    8 rows in set (0.00 sec)
     
    mysql> select name, count(name), count(1), count(*), count(age), count(distinct(age))
        -> from counttest
        -> group by name;
    +------+-------------+----------+----------+------------+----------------------+
    | name | count(name) | count(1) | count(*) | count(age) | count(distinct(age)) |
    +------+-------------+----------+----------+------------+----------------------+
    | a    |           3 |        3 |        3 |          3 |                    2 |
    | b    |           2 |        2 |        2 |          1 |                    1 |
    | c    |           1 |        1 |        1 |          1 |                    1 |
    | d    |           1 |        1 |        1 |          0 |                    0 |
    | e    |           1 |        1 |        1 |          1 |                    1 |
    +------+-------------+----------+----------+------------+----------------------+
    5 rows in set (0.00 sec)


    额外参考资料:http://blog.csdn.net/lihuarongaini/article/details/68485838
     

    展开全文
  • 当我们对一张数据表中的记录进行统计的时候,习惯都会使用count函数来统计,但是count函数传入的参数有很多种,比如count(1)、count(*)、count(字段)等。到底哪种效率是最好的呢?是不是count(*)效率最差?我曾经...
  • count(字段),count(*)和count(1)的区别

    千次阅读 2022-03-12 23:05:39
    很多人认为count(1)执行的效率会比count()高,原因是count()会存在全表扫描,而count(1)可以针对一个字段进行查询。其实不然,count(1)和count(*)都会对全表进行扫描,统计所有记录的条数,包括那些为null的记录,...
  • count(*)和count(1)的区别

    千次阅读 2022-01-08 15:34:28
    使用count函数,当要统计的数量比较大时,发现count(*)花费的时间比较多,相对来说count(1)花费的时间比较少。 1、如果你的数据表没有主键,那么count(1)比count(*)快 ;如果有主键的话,那主键(联合主键)作为...
  • 一、count(1)和count(*) 当表的数据量比较大,对表作分析之后,使用count(1)比使用count(*)用时多。 从执行计划看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些。 ...
  • 当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count(*)、count(字段) 等。 到底哪种效率是最好的呢?是不是 count(*) 效率最差?...
  • count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。 count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个...
  • count(*)和count(1)的区别是什么?

    万次阅读 多人点赞 2019-04-16 10:42:12
    使用count函数,当要统计的数量比较大时,发现count(*)花费的时间比较多,相对来说count(1)花费的时间比较少。 1、如果你的数据表没有主键,那么count(1)比count(*)快 ;如果有主键的话,那主键(联合主键)作为...
  • 维护同事的代码发现他的 sql 查询记录条数都是 count(1),而我则习惯用 count(*),这有什么区别呢? 含义: 1count(*) :统计所有的行数,包括为null的行(COUNT(*)不单会进行全表扫描,也会对表的每个字段进行...
  • select count(*)和select count(1)的区别

    万次阅读 多人点赞 2020-04-02 13:37:44
    1、 一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 2、 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 3、 如果有主键的話,那主键作为count的条件时候count(主键)最快 4、 如果...
  • MySQL之count(1)和count(*)的区别

    千次阅读 2018-12-26 16:32:15
    闲扯 很久以前,有一次我写了一个SQL: select count(*) from test; 然后这个代码被我的其中一家公司的MySQL专家看到了,叫我过去说: ...先说结论,我是对的,count(*)不但不慢,count(1)也会和coun...
  • count(1)、count(*)、count(列名)的区别

    千次阅读 2020-11-24 10:17:21
    2、count(1):计算一共有多少符合条件的行(其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1…同理,count(2),也可以,得到的值完全一样,count(‘x’),count(‘y’)都是可以的...
  • count(1) 和count(*)哪个高效?

    千次阅读 2019-08-15 09:32:14
    1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和count()的效果是一样的。但是在表做过分析之后,count(1)会比count()的用时...
  • count(1)、count(*)与count(列名)的执行区别

    万次阅读 多人点赞 2018-12-14 17:09:38
    1count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!  从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)...
  • count(*):所有行进行统计,包括NULL行count(1):所有行进行统计,包括NULL行count(column):对column中非Null进行统计我在集群找了一个表试了一下,结果差距不是很大,因为执行时间会受集群资源的影响,所以看下...
  • COUNT(1)和COUNT(*) 的区别

    千次阅读 2020-03-21 02:56:35
    两者本质上没有任何区别。 参见MYSQL 参考手册 InnoDBhandlesSELECT COUNT(*)andSELECT COUNT(1)operations in the same way.... 一、count情况 ...1count(1):可以统计表中所有数据,不统计所有的列,...
  • count(*)和count1)和count(列名)的区别

    万次阅读 多人点赞 2018-11-23 11:00:57
    count是一种最简单的聚合函数,一般也是我们第一个开始学习的聚合函数,那么他们之间究竟由什么区别呢?... count1)和count(*)之间没有区别,因为count(*)count1)都不会去过滤空值, 但count(列...
  • 注:下面的讨论和结论是基于 InnoDB 引擎的。首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 ...
  • select 1 和select *select * from 表;查询出表中所有数据,性能比较差;select 常量 from 表;查询出结果是所有记录数的常量,性能比较高;selelct 常量 from ... 对应所有行,返回的永远只有一个值,即常量。例如...
  • 最近看了一篇文章,讲了一大堆,最后得出一些结论。说是在某种情况下,怎么写速度最快。但是自己去实际验证的时候,其实并不是他说的那样,实践出真知,所以自己就把测试的...3、count(*)和count(1)两个函数没有区别...
  • count(*)和count1)的区别和性能分析

    万次阅读 多人点赞 2019-04-24 15:06:39
    有的人用的是count() 有的用的是count(1),区别是什么,这两个的使用场景是什么?我这里主要针对的是MySQL,也许可能在别的引擎就不一定,比如别的搜索引擎会不会对count()有优化这个我就不确定。 首先你要你要知道这...
  • count(0) 和 count1

    千次阅读 2018-12-04 20:51:11
     select count(case when sex=1 then 1 else 0 end)as ‘男’,count(case when sex=2 then 1 else 0 end) as ‘女’ from demo 得出结果总是 总数(男女之和如count(*)) 后来才发现 count(...
  • sql优化——count(1)、count(*)与count(列名)的区别

    万次阅读 多人点赞 2019-07-12 18:28:10
    1.count(1) and count(*): 基本没差别 count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略NULL 2. count(1) and count(列名): (1count(1) 会统计表中的所有的记录数,不会忽略NULL,包含...
  • 一:Count(*) 、Count1)、Count(543)或者无论Count(‘anything’) 只要在Count中指定非NULL表达式,结果没有任何区别。因此当你指定Count(*) 或者Count1)、Count(543)或者无论Count(‘anything’)时...
  • count(*)和count(字段名)和count(1)

    万次阅读 多人点赞 2019-02-22 13:47:41
    1,比较count(*)和count(字段名)的区别:前者对行的数目进行计算,包含null,后者对特定的列的值具有的行数进行计算,不包含null,得到的结果将是除去值为null和重复数据后的结果。 2.count1)跟count(主键)一样...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,646,018
精华内容 1,458,407
关键字:

count(1)

友情链接: usbdll.zip