本文主要给大家展示“MySQL中count(1)、count(*)和count (field)有什么区别”,简单易懂,组织清晰,希望能帮你解决疑惑。让边肖带领大家学习《MySQL中count(1)、count(*)和count (field)有什么区别》一文。
关于数据库行数的统计,无论是MySQL还是Oracle,都有一个可以使用的函数,那就是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.选择count (*)时,有无where条件有什么区别吗?
10.COUNT(*)、COUNT(1)、COUNT(字段名)的执行过程是怎样的?
如果以上10个问题都能正确回答,那么你就真的知道COUNT函数了。
00-1010 1,COUNT(expr),返回由SELECT语句检索的行数,该语句的expr值不为空。结果是一个BIGINT值。
2.如果查询结果没有找到任何记录,则返回0。
3.但是,值得注意的是,COUNT(*)的统计结果将包含空值的行数。
除了COUNT(id)和COUNT(*),还可以使用COUNT(常量)(如COUNT(1))来计算行数。这三种SQL语句有什么区别?哪个效率更高?为什么《阿里巴巴Java开发手册》中强制不使用COUNT(列名)或COUNT(常量)来代替COUNT(*)?
1.初识COUNT
COUNT(常量)和COUNT(*)表示数据库表中可以直接查询的行数。
COUNT(列空)表示满足查询条件的列值为非空的行数。
COUNT(*)是对SQL92定义的行进行计数的标准语法。因为是标准语法,MySQL数据库优化了很多。
SQL92是数据库的ANSI/ISO标准。它定义了一种语言(SQL)和数据库的行为(事务、隔离级别等)。).
2.COUNT(字段)、COUNT(常量)和COUNT(*)之间的区别
MySQL主要使用两个执行引擎:
InnoDB引擎
MyISAM引擎
MyISAM不支持事务;MyISAM中的锁是表级锁;InnoDB支持事务和行级锁。
3.COUNT(*)的优化
MyISAM做了一个简单的优化,分别记录了表中的总行数。如果执行count(*),只要没有where条件,就可以直接返回。MyISAM是表级锁,不会有并发的行操作,所以结果是准确的。
MyISAM
InnoDB不能使用这个缓存操作,因为它支持事务,大部分操作都是行级锁,可能会并行修改行,所以缓存记录不准确。
然而,InnoDB对COUNT(*)语句做了一些优化。
用低成本索引扫描表格,不关注表格的具体内容。
InnoDB中的索引分为聚集索引(主键索引)和非聚集索引(非主键索引)。聚集索引的叶节点保存整行记录,而非聚集索引的叶节点保存该行记录的主键的值。
MySQL将优先使用最小的非聚集索引来扫描表。
优化的前提是查询语句不包含where条件和group by条件。
InnoDB
MySQL官方文档这样说:
InnoDB以相同的方式处理SELECT COUNT(*)和SELECT COUNT(1)操作。性能没有差别。
所以,对于count(1)和count(*),MySQL优化完全一样,没有更快的了!
但是,仍然建议使用count(*),因为这是对SQL92定义的行进行计数的标准语法。
00-1010,扫描整个表确定指定字段的值是否为空,如果不为空则累加。
性能比计数(1)和计数(*)慢。
4.COUNT(*)和COUNT(1)
COUNT函数的用法主要用于统计行数。主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。
因为COUNT(*)是SQL92定义的对行进行计数的标准语法,所以MySQL对其进行了大量优化。MyISAM会直接单独记录表中的总行数,以COUNT(*)进行查询,而InnoDB在扫描表时会选择最小的索引,以降低成本。当然,这些优化的前提是没有where和group的条件查询。
在InnoDB中COUNT(*)和COUNT(1)的实现没有区别,效率是一样的,但是COUNT(字段)需要对字段进行非null判断,所以效率NULL会更低。
因为COUNT(*)是SQL92定义的统计行数的标准语法,而且效率高,所以请直接使用COUNT(*)查询表中的行数!
以上就是《MySQL中count(1)、count(*)和count (field)有什么区别》一文的全部内容,感谢阅读!相信大家都有一定的了解,希望分享的内容对大家有所帮助。想了解更多知识,请关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155608.html