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

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

WHERE 条件中,无论是写成 ZARA 还是 Zara,结果都是一样的 count(1),count(*),count(字段)区别 count(1)和count(*) 作用 都是检索表中所有记录行的数目...,不论其是否包含null值 区别 count(1)比count(*)效率高 二 . count(字段)与count(1)和count(*)的区别 count(字段)的作用是检索表中的这个字段的非空行数,...= ‘value’ 这种 杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现 如果表没有主键,那么count(1)比count(*)...快 如果有主键,那么count(主键,联合主键)比count(*)快 如果表只有一个字段,count(*)最快 count(1)跟count(主键)一样,只扫描主键。...count(*)跟count(非主键)一样,扫描整个表 明显前者更快一些。

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

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

    ) 2 count(1)、count(*)是检索表中所有记录行的数目,无论是否包含null值 count(1)比count(*)效率高 count(字段),检索表中的该字段的非空行数,即不统计该字段值为...)比count(*)快 若表只有一个字段,count(*)最快 count(1)跟count(主键)一样,只扫描主键 count(*)跟count(非主键)一样,扫描整个表 明显前者更快。...count(1) and count(字段) count(1) 会统计表中的所有的记录数,包含字段为null 的记录 count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。...实例 create table counttest(name char(1), age char(2)); mysql> select * from counttest; +------+------+...| 16 | | c | 17 | | d | NULL | | e | | +------+------+ 8 rows in set (0.00 sec) mysql

    4.3K20

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

    count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层,...count(1) 扫描全表,但不取值,server层收到的每一行都是1,判断不可能是null,按值累加。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...因为count(*)返回的行一定不是空。扫描全表,但是不取值,按行累加。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

    3.2K30

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

    count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层,...count(1) 扫描全表,但不取值,server层收到的每一行都是1,判断不可能是null,按值累加。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...因为count(*)返回的行一定不是空。扫描全表,但是不取值,按行累加。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

    3.4K10

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

    count(列名)某个字段值为NULL时,不统计 如果问一个程序员MySQL中SELECT COUNT(1)和SELECT COUNT(*)有什么区别,会有很多人给出这样的答案“SELECT COUNT...细心的同学会发现,innodb的表也有这么一个存储了表行数的变量,但是很遗憾这个值是一个估计值,没有什么实际意义。 Innodb 在该引擎下,COUNT(1)和COUNT(*)哪个快呢?...结论是:这俩在高版本的MySQL(5.5及以后,5.1的没有考证)是没有什么区别的,也就没有COUN(1)会比COUNT(*)更快这一说了。 WHY?...当MySQL确认括号内的表达式值不可能为空时,实际上就是在统计行数。...最简单的就是当我们使用COUNT(*)的时候,这种情况下通配符*并不像我们猜想的那样扩展成所有的列,实际上,他会忽略所有列而直接统计所有的行数“——《高性能MySQL》。

    3.4K30

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

    在 MySQL 中,COUNT 函数是一个非常常用的聚合函数,它用于计算某列或某表达式在查询结果中出现的次数。...但是,在某些特殊情况下,COUNT(*) 可能会比 COUNT(主键id) 稍微快一点,这是因为 MySQL 可以直接通过读取页头来获取表的总记录数,而不需要扫描主键索引。...实际上,在大多数情况下,这两种写法的性能基本相同,因为 MySQL 对它们进行了相同的优化。MySQL 会使用索引或全表扫描统计记录数,对于单表查询的情况,索引扫描通常比全表扫描要快一些。...综上所述,我们可以得出以下结论:当查询的表中不存在 WHERE 子句和 GROUP BY 子句时,COUNT(*) 可能比 COUNT(主键id) 稍微快一点。...在单表查询时,COUNT(1) 和 COUNT(字段) 的性能通常相同,因为它们使用的优化方案也相同。在多表查询时,COUNT(1) 通常比 COUNT(字段) 更快。

    2K30

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

    对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为空的,就按行累加。...对于count(1)来说,InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。...看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非空啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...但是这种需要专门优化的情况太多了,而且MySQL已经优化过count(*)了,你直接使用这种用法就可以了。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。

    5.3K50

    MySQL查询---COUNT函数

    可以发现执行速度两条SQL语句是相差无几的,count(1)和count(*)都是查询全表数据行数,可能网上很多言论会说count(*)其实走的就是count(1)查询,所以使用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的数据效率方面肯定是慢上不少的。...所以说我们在需要取整表行数的时候就可以给表加一个非空的tinyint类型字段,并且添加二级索引,count(*)就会使用这个二级索引,优化查询速度。

    3.9K20

    MySQL COUNT性能分析

    上述的count(*)指的是在查询的时候不加where条件,不加where条件的count(*)在不同的数据库引擎下有不同的实现: MyISAM引擎,会将表的总行数记录在磁盘上,因此count(*)会直接返回个数...由于InnoDB的事务支持,同一时刻的多个事务的查询,由于多版本并发控制的(MVCC)的原因,InnoDB表返回的行数是不确定。 InnoDB对COUNT(*)优化?...对于count(*),MySQL优化器会找到最小的那棵索引树然后进行遍历。 如果某张大表需要经常性的进行count(*)操作,可以考虑单独建立一张表进行保存大表的记录行数。 COUNT的具体含义?...COUNT(主键ID),InnoDB会遍历整张表,把每一行的ID值都取出来,返回给Server层。Server层拿到ID以后,判断不可能为空,按行累加。...COUNT(1),InnoDB引擎遍历整张表,但不取值。Server层对于返回的每一行放一个数字"1"进去,判断不可能为空,按行累加。

    1.2K10

    MySQL count知多少

    生成3张表innodb表,如下: nums_1表只有字符串主键字段 /* 生成只有一个字符串类型字段主键的表nums_1 */mysql> create table nums_1 (p1 varchar...精确查找数据量,则可以通过count(主键字段),count(*), count(1) [这里的1可以替换为任意常量] 2.1 非精确查询 如果只是查一张表大致有多少数据,尤其是很大的表 只是查询其表属于什么量级的...3.1 MyISAM引擎表 3.1.1 查询整张表数据量 如果想精确查询一张MyISAM表的数据量,使用 count(主键) count(1) count(*) 效率均一致,直接查出准确结果,耗时几乎为...现在将nums_3表的c2,c3字段分别统计,查看结果(先添加索引,提高查询性能) mysql> select count(c2) from nums_3 ;+-----------+| count...表统计效率 count(主键) count(1) ≈ count(*) MySQL建议设置自增字段类型的主键 表大小越小,查询统计效率越高

    3.8K20

    Mysql COUNT() 函数详解

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

    69310

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

    对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为空的,就按行累加。...对于count(1)来说,InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。...看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非空啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...但是这种需要专门优化的情况太多了,而且MySQL已经优化过count(*)了,你直接使用这种用法就可以了。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。

    1.8K40

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

    今天有人跟我讲 MySQL 中 count(1) 比 count(*) 快,这能忍?必须得和他掰扯掰扯。 声明:以下讨论基于 InnoDB 存储引擎,MyISAM 因为情况特殊我在文末会单独说一下。...key:这个表示 MySQL 决定采用哪个索引来优化对该表的访问,PRIMARY 表示利用主键索引,NULL 表示不用索引。...3.2 原理分析 不知道小伙伴们有没有注意过,我们学习 MySQL 的时候,count 函数是归在聚合函数那一类的,就是 avg、sum 等,count 函数和这些归在一起,说明它也是一个聚合函数。...对于 select count(username) from user; 这个查询来说,InnoDB 引擎会遍历整张表做全表扫描,读取每一行的 username 字段并返回,如果 username 在定义时候设置了...最后再来说说 select count(*) from user; ,这个 SQL 的特殊之处在于它被 MySQL 优化过,当 MySQL 看到 count(*) 就知道你是想统计总记录数,就会去找到一个最小的索引树去遍历

    1.5K10

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

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

    98400

    MySQL几种count比较

    GreatSQL开源社区推送了这篇文章《MySQL之COUNT性能到底如何?》,让我们了解MySQL数据库中count的执行情况,COUNT(1)、COUNT(*)和COUNT(字段)到底谁更快?...前言 在实际开发过程中,统计一个表的数据量是经常遇到的需求,用来统计数据库表的行数都会使用COUNT(*),COUNT(1)或者COUNT(字段),但是表中的记录越来越多,使用COUNT(*)也会变得越来越慢...执行效果, COUNT(*):MySQL对COUNT(*)进行了优化,COUNT(*)直接扫描主键索引记录,并不会将全部字段取出来,直接按行累加。...COUNT(*)和TABLES_ROWS 在InnoDB中,MySQL数据库每个表占用的空间、表记录的行数可以打开MySQL的information_schema数据库。...(3) 因为COUNT(*)是SQL92定义的标准统计行数的语法,所以MySQL对他进行了很多优化,MyISAM中会直接将表的总行数单独记录下来供COUNT(*)查询,而InnoDB则会在扫表的时候选择最小的索引来降低成本

    2.4K20

    一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别

    测试 MySQL版本:5.7.29 创建一张用户表,并插入一百万条数据,其中gender字段有五十万行是为null值的 CREATE TABLE `users` ( `Id` bigint(20)...; count(*) 在 MySQL 5.7.18 之前,通过扫描聚集索引来InnoDB处理 语句。...SELECT COUNT(*)从 MySQL 5.7.18 开始,通过遍历最小的可用二级索引来InnoDB处理SELECT COUNT(*)语句,除非索引或优化器提示指示优化器使用不同的索引。...对于MyISAM表, 如果从一个表中检索,没有检索到其他列并且没有 子句,COUNT(*)则优化为非常快速地返回,此优化仅适用于MyISAM 表,因为为此存储引擎存储了准确的行数,并且可以非常快速地访问...COUNT(1)仅当第一列定义为 时才进行相同的优化NOT NULL。----来自MySQL官网 这些优化都是建立在没有where 和 group by的前提下的。

    1.8K10
    领券