首页
学习
活动
专区
圈层
工具
发布

MYSQL 下 count(*)、count(列)、 count(1) 理解

结论: 执行效果上: count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL...count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...> call sp_name(); Query OK, 0 rows affected mysql> select count(*) from t; +----------+ | count(*) |...| +----------+ 1 row in set mysql> select count(1) from t; +----------+ | count(1) | +----------+ |...*name 的执行计划 type = All 是进行的全表扫描,而count(*) count(1), count(列,主键) 的type 是null,执行时甚至不用访问表或索引 MySQL5.7文档中有一段话

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

    MySQL count()函数及其优化count(1),count(*),count(字段)区别

    ,让我们祭出 employee_tbl 表 所有记录 统计行的总数 计算 Zara 的记录数 注意:由于 SQL 查询对大小写不敏感,所以在 WHERE 条件中,无论是写成 ZARA 还是 Zara,结果都是一样的...count(1),count(*),count(字段)区别 count(1)和count(*) 作用 都是检索表中所有记录行的数目,不论其是否包含null值 区别 count(1)比count(*)效率高...二 . count(字段)与count(1)和count(*)的区别 count(字段)的作用是检索表中的这个字段的非空行数,不统计这个字段值为null的记录 任何情况下SELECT COUNT(1)...tablename WHERE COL2 = ‘value’ 的出现 如果表没有主键,那么count(1)比count(*)快 如果有主键,那么count(主键,联合主键)比count(*)快 如果表只有一个字段...,count(*)最快 count(1)跟count(主键)一样,只扫描主键。

    4.4K60

    MySQL 不同存储引擎下 count(星) count(1) count(field) 结果集和性能上的差异,不要再听网上乱说了

    前言hello,大家好,我是 Lorin,不知道大家面试或者日常使用中是不是经常遇到这个问题,count(*)、count(1)、count(field) 执行结果集有什么区别?...、count(field) 为上层的标准结果,不同存储引擎的底层实现方式可以不相同,但是结果是一样的,因此主要比较三种查询方式查询结果。...(2)...count(n)count(*) 和 count(1)、count(2)...count(n) 语义上略有区别,但它们的执行结果集一致。...(*) COUNT(n) 没有其它查询条件,或COUNT(field) 对应的列不为 NULL,则会很快返回计数结果。...MySQL底层索引的实现很好理解,比如:// 首先我们需要基本记住的是: count(*) count(n) 查询的是所有的数据。

    1.3K20

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

    首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

    3.9K30

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

    首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

    4.2K10

    高性能MySQL——Count(1) OR Count(*)?(转)

    count(列名)某个字段值为NULL时,不统计 如果问一个程序员MySQL中SELECT COUNT(1)和SELECT COUNT(*)有什么区别,会有很多人给出这样的答案“SELECT COUNT...结论是:这俩在高版本的MySQL(5.5及以后,5.1的没有考证)是没有什么区别的,也就没有COUN(1)会比COUNT(*)更快这一说了。 WHY?...如果在COUNT()的括号中定了列或者列表达式,则统计的就是这个表达式有值的结果数。......COUNT()的另一个作用是统计结果集的行数。...(1)和COUNT(*)可以看到解释器的结果如下(两者一致,所以就只截了一张图),可以看到,两者都用了主键索引进行行数的统计: ?...第二步 新建一个二级索引title,之后在分别看一下COUNT(1)和COUNT(*)的解释器结果(两者依然完全一致),这时已经用二级索引进行统计而非主键索引: ?

    3.8K30

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

    在 MySQL 中,COUNT 函数是一个非常常用的聚合函数,它用于计算某列或某表达式在查询结果中出现的次数。...COUNT(*) 与 COUNT(主键id)首先,我们来看 COUNT(*) 与 COUNT(主键id) 这两个写法的区别。它们都可以用来计算查询结果集中记录的数量,但是,它们的语义是不相同的。...这里需要注意的是,如果主键是一个自增长列,那么 COUNT(*) 和 COUNT(主键id) 得到的结果是相同的,因为自增长列的值必定不为 NULL。那么,这两种写法的效率如何呢?...COUNT(字段) 与 COUNT(1)接下来,我们来看 COUNT(字段) 与 COUNT(1) 这两个写法的区别。它们都可以用来计算查询结果集中记录的数量,但是,它们的语义是不相同的。...但是,如果在多表查询的情况下使用 COUNT(1) 或 COUNT(字段),就需要注意它们的性能问题了。在这种情况下,MySQL 必须进行联接操作,然后再统计记录数。

    2.7K30

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

    这里,首先你要弄清楚count()的语义。count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非空啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...但是这种需要专门优化的情况太多了,而且MySQL已经优化过count(*)了,你直接使用这种用法就可以了。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。

    5.8K50

    MySQL查询---COUNT函数

    *:查询符合条件的行数,和列值是否为NULL无关,返回结果都会返回。 常量:查询符合条件的行数,和列值是否为NULL无关,返回结果都会返回。...count(*),count(id)与count(1)效率对比 实际上对于count(*)和count(1)效率哪个更高,众说纷坛。我们可以先看看效率对比: ? ?...因为Mysql官方文档写了这么一句话: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way....我个人建议使用count(*),因为SQL92标准中制定count(*)为标准统计行数的语法,所以Mysql一直在不断地对count(*)做一定的优化。那有人说count(id)效率会不会更高?...count(*)一样全表检索,但是不会取id值,因为在索引树就可以得到结果,所以count(id)需要取到数据再过滤id为null的数据效率方面肯定是慢上不少的。

    4.8K20

    MySQL中COUNT(*)、COUNT(1)和COUNT(column),到底用哪个?

    COUNT(*) 与 COUNT(1)比较 在MySQL的官方文档中是这样介绍COUNT函数的: COUNT(expr)官方说明 也就是说,COUNT(expr) 函数会返回SELECT语句检索的行中expr...如果查询结果没有命中任何记录,则返回0;需要注意的是COUNT(*) 的统计结果中,会包含值为NULL的行数。...在《高性能Mysql》一书中对COUNT()函数的作用介绍如下: COUNT()是一个特殊的函数,有两种非常不同的作用:它可以统计某个列值的数量,也可以统计行数。...如果在COUNT()的括号中指定了列或者列的表达式,则统计的就是这个表达式有值的结果数。因为很多人对NULL理解有问题,所以这里很容易产生误解。 COUNT()的另一个作用是统计结果集的行数。...一个最常见的错误就是,在括号内指定了一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用COUNT(*),这样写意义清晰,性能也会很好。

    14500

    MySQL count知多少

    ,因为均是取自相同的统计信息 MyISAM表的结果是精确值(表数据量,不包含其他字段) mysql> select * from information_schema.tables where table_schema...3.1 MyISAM引擎表 3.1.1 查询整张表数据量 如果想精确查询一张MyISAM表的数据量,使用 count(主键) count(1) count(*) 效率均一致,直接查出准确结果,耗时几乎为...in set (1.38 sec) 简单的对比发现,查询性能结果为 count(主键) count(1) ≈ count(*) 但是查看执行计划都是如下情况 mysql> explain select...count(1):也是遍历整张表,因为每行的结果都是1(非空),所以可以直接计数,无需判断是否为空。...现在将nums_3表的c2,c3字段分别统计,查看结果(先添加索引,提高查询性能) mysql> select count(c2) from nums_3 ;+-----------+| count

    4.1K20

    Mysql COUNT() 函数详解

    下面开始说今天的正文内容...在使用Mysql的时候,作为开发者,聚合函数是肯定会用到的,下面就来说说我们常用到的统计行数的聚合函数 COUNT()。...,这里提前准备一个表并填充部分数据,比如SELECT * FROM sys_post;查询结果如下图所示,可以看到sys_post的一些数据信息COUNT(*)首先利用COUNT() 来统计表中满足条件的所有的数据行数...,COUNT() 统计行数通常包括 NULL 和重复项,比如SELECT COUNT(*) FROM sys_post;统计结果如图所示,满足我们的预期,统计了包括NULL在内的数据数量COUNT(1)...(1) FROM sys_post;统计结果如图所示,和我们上面使用 COUNT(*)的统计结果是一样的,也是包含了NULL在内的数量COUNT(column)还有一种统计数据的方法,就是通过 COUNT...BY create_by HAVING COUNT(*)>1;统计结果如图所示到这里关于mysql 统计函数 count() 函数的一些介绍以及基本用法就说完了。

    1.2K10

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

    这里,首先你要弄清楚count()的语义。count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非空啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...但是这种需要专门优化的情况太多了,而且MySQL已经优化过count(*)了,你直接使用这种用法就可以了。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。

    2.2K40

    MySQL 中 count(*) 比 count(1) 快?

    今天有人跟我讲 MySQL 中 count(1) 比 count(*) 快,这能忍?必须得和他掰扯掰扯。 声明:以下讨论基于 InnoDB 存储引擎,MyISAM 因为情况特殊我在文末会单独说一下。...3.2 原理分析 不知道小伙伴们有没有注意过,我们学习 MySQL 的时候,count 函数是归在聚合函数那一类的,就是 avg、sum 等,count 函数和这些归在一起,说明它也是一个聚合函数。...既然是聚合函数,那么就需要对返回的结果集进行一行行的判断,这里就涉及到一个问题,返回的结果是啥?...1,最后将结果累加。...最后再来说说 select count(*) from user; ,这个 SQL 的特殊之处在于它被 MySQL 优化过,当 MySQL 看到 count(*) 就知道你是想统计总记录数,就会去找到一个最小的索引树去遍历

    1.8K10

    mysql面试题38:count(1)、count(*) 与 count(列名) 的区别

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官: count(1)、count(*) 与 count(列名) 的区别 当使用COUNT...函数进行数据统计时,有三种常见的用法:COUNT(1)、COUNT(*)和COUNT(列名)。...COUNT():在COUNT函数中使用作为参数,表示统计行数。与COUNT(1)类似,它也只关注行数而不涉及具体的列。...COUNT(列名)会统计指定列中非NULL的行数,并返回结果。这种写法适用于需要统计特定列的情况。...关键点:COUNT(1)和COUNT()用于统计行数,COUNT(1)忽略NULL值,而COUNT()包括NULL值。COUNT(列名)用于统计指定列的非NULL值的数量。

    1.4K00
    领券