数据库count 1-mysql count(*) 与count(1)
MySQLcount(1)、count(*)、count(field)的区别
更新时间:2021-12-22 15:17:13 作者:Hider1214
COUNT广泛应用于数据库行统计,那么你知道MySQLcount(1)、count(*)、count(field)的区别吗? 本文只是想介绍一下。 如果你有兴趣,你可以了解一下
目录 4.COUNT(*) 和 COUNT(1) 5.COUNT(field) 6. 总结
关于数据库行数的统计,无论是MySQL还是Oracle,都有一个函数可以使用数据库count 1,那就是COUNT。
但是,这个常用的COUNT函数却隐藏着很多玄机,尤其是在面试的时候,一不小心就会被虐。 如果您不相信我,请尝试回答以下问题:
> 1. COUNT有多少种用法?
> 2、COUNT(字段名)和COUNT(*)的查询结果有什么区别?
> 3. COUNT(1) 和 COUNT(*) 有什么区别?
> 4. COUNT(1) 和 COUNT(*) 哪个更有效率?
> 5.为什么《阿里巴巴Java开发手册》推荐使用COUNT(*)
> 6. MySQL的MyISAM引擎对COUNT(*)做了哪些优化?
> 7. MySQL的InnoDB引擎对COUNT(*)做了哪些优化?
> 8. 上述MySQL优化COUNT(*)的关键前提是什么?
> 9. SELECT COUNT(*)时,加不加where条件有区别吗?
> 10. COUNT(*)、COUNT(1)、COUNT(field name)的执行过程是怎样的?
如果你能准确回答以上10道题,就说明你真正理解了COUNT函数。
1. 了解 COUNT
1、COUNT(expr),返回SELECT语句检索到的行中expr的值不为NULL的行数。 结果是一个 BIGINT 值。
2.如果查询结果没有命中任何记录,则返回0
3、但是值得注意的是,COUNT(*)的统计结果会包含值为NULL的行数。
除了COUNT(id)和COUNT(*),还可以用COUNT(常数)(比如COUNT(1))来统计行数,那么这三种SQL语句有什么区别呢? 哪一个更有效率? 为什么《阿里巴巴Java开发手册》中强制不使用COUNT(列名)或COUNT(常量)而不是COUNT(*)?
2、COUNT(字段)、COUNT(常量)和COUNT(*)的区别
COUNT(常量)和COUNT(*)表示数据库表中满足直接查询条件的行数。
而COUNT(列名)表示限定列的值不为NULL的行数。
COUNT(*) 是用于计算 SQL92 定义的行数的标准语法。 因为是标准语法,所以MySQL数据库做了很多优化。
SQL92 是数据库的 ANSI/ISO 标准。 它定义了一种语言 (SQL) 和数据库的行为(事务、隔离级别等)。
3. COUNT(*)的优化
MySQL主要使用两个执行引擎:
MyISAM不支持事务,MyISAM中的锁是表级锁; 而 InnoDB 支持事务和行级锁。
MyISAM
MyISAM做了一个简单的优化,单独记录表的总行数。 如果执行count(*),可以直接返回,前提是没有where条件。 MyISAM是表级锁,不会有并发的行操作,所以查到的结果是准确的。
InnoDB
InnoDB不能使用这种缓存操作,因为它支持事务,大部分操作是行级锁,行可能被并行修改,所以缓存记录不准确。
但是,InnoDB 仍然对 COUNT(*) 语句做了一些优化。
通过低成本索引扫描表,无需关注表的具体内容。
InnoDB中的索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引)。 聚集索引的叶子节点存储的是整行记录数据库count 1,而非聚集索引的叶子节点存储的是该行记录的主键值。
MySQL会优先使用最小的非聚集索引来扫描表。
优化的前提是查询语句不包含where条件和group by条件。
4. 计数(*) 和计数(1)
官方 MySQL 文档是这样说的:
InnoDB 以相同的方式处理 SELECT COUNT(*) 和 SELECT COUNT(1) 操作。 没有性能差异。
所以对于count(1)和count(*),MySQL的优化是完全一样的,没有谁更快!
但是还是推荐使用count(*),因为这是SQL92定义的统计行数的标准语法。
5.计数(字段)
扫描全表,判断指定字段的值是否为NULL,不为NULL则累加。
性能比 count(1) 和 count(*) 慢。
6.总结
COUNT函数的用法主要是用来统计表中的行数。 主要用法是 COUNT(*)、COUNT(field) 和 COUNT(1)。
因为COUNT(*)是SQL92定义的统计行数的标准语法,所以MySQL对它做了很多优化。 MyISAM会直接记录表中的总行数用于COUNT(*)查询,而InnoDB会在建表时扫描选择最小的索引来降低成本。 当然,这些优化的前提是没有where和group的条件查询。
InnoDB中COUNT(*)和COUNT(1)的实现没有区别,效率是一样的,但是COUNT(field)需要判断字段是否不为NULL,所以效率会低一些。
因为COUNT(*)是SQL92定义的统计行数的标准语法,效率很高,请直接使用COUNT(*)查询表的行数!
参考链接: MySQL的COUNT语句竟然能被面试官滥用! ?
关于MySQL count(1)、count(*)、count(field)的区别,本文到此结束。 更多关于MySQL count(1)、count(*)、count(field)的内容,请搜索脚本之家以往文章或继续浏览下方相关文章。 希望大家以后多多支持脚本之家!