MySQL COUNT(*) & COUNT(1) & COUNT(col) 比较分析
在面试的时候我们会经常遇到这个问题:
MySQL 中,COUNT(*)、COUNT(1)、COUNT(col) 有区别吗?
有区别。
接下来我们分析一下这三者有什么样的区别。
一、SQL Syntax & Semantics
从语义角度看,它们有不同的含义。
COUNT(返回查询到的行中 expr is not-NULL 的个数,返回类型为 BIGINT(8 bytes)。expr)
Returns a count of the number of non-
NULLvalues ofexprin the rows retrieved by aSELECTstatement. The result is aBIGINTvalue.
COUNT(*) 有点不同,它返回查询到的结果集中的行的个数,不论这些行是否含有 NULL 值。
COUNT(*)is somewhat different in that it returns a count of the number of rows retrieved, whether or not they containNULLvalues.
COUNT(1) 返回查询到的行中第一列 not NULL 的个数。
COUNT(col) 返回查询到的行中 col 列中 not NULL 的个数。
二、查询性能
在 MySQL 中讨论查询性能时,我们需要区分存储引擎。
不同的存储引擎以不同的方式存储数据,这决定了最终的操作效率。
MyISAM 的主键、辅助索引都是非聚簇索引,B+树的叶节点包含的是数据的地址。
InnoDB 的主键是聚簇索引,叶节点存放的是数据本身;辅助索引是非聚簇索引,叶节点存放的是主键。
1、MyISAM
MyISAM 为每张表存储了一个准确(exact)的 row count。
因此,MyISAM 可以为 COUNT(*) 提供查询优化:当某个 SELECT 语句仅仅查询一张表、不查询其他列、没有查询条件(WHERE 子句)时,COUNT(*) 可以很快地返回这个 row count(e.g. SELECT COUNT(*) FROM tbl_name)。
当第一列定义为 NOT NULL 时,COUNT(1) 和 COUNT(*) 具有相同的查询性能。
2、InnoDB
InnoDB 是一款 transactional 存储引擎。
可能有多个事务并发操作一张表,所以 InnoDB 无法为每张表存储一个准确的 row count(因为不同的 transaction 可能会看到不同的 row count,row count 很难准确)。
对于 InnoDB 而言,COUNT(*)、 COUNT(1) 没有性能上的差异。
COUNT(*) 会利用索引:在 MySQL 5.7.18 之前,会利用聚簇索引;在 MySQL 5.7.18 之后,会利用一个最小的辅助索引(有的话)。
三、参考资料:
What is better in MYSQL count(*) or count(1)?
MySQL COUNT(*) & COUNT(1) & COUNT(col) 比较分析的更多相关文章
- 【MySQL】技巧 之 count(*)、count(1)、count(col)
只看结果的话,Select Count(*) 和 Select Count(1) 两着返回结果是一样的. 假如表沒有主键(Primary key), 那么count(1)比count(*)快,如果有主 ...
- mysql技巧之select count的比较
在工作过程中,时不时会有开发咨询几种select count()的区别,我总会告诉他们使用select count(*) 就好.下文我会展示几种sql的执行计划来说明为啥是这样. 1.测试 ...
- MySQL查询count(*)、count(1)、count(field)的区别收集
经过查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*).count(1).count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会 ...
- mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化
原文:mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化 问题描述 mysql 5.7 innodb 引擎 使用以下几种方法进行统计效率差不 ...
- 慕课网 性能优化之MySQL优化--- max 和count的性能优化
注:在执行SQL语句前加上explain可以查看MySQL的执行计划 数据库:MySQL官方提供的sakila数据库 Max优化: 例如:查询最后支付时间 explain select max(pay ...
- MySQL · 引擎特性 · InnoDB COUNT(*) 优化(?)
http://mysql.taobao.org/monthly/2016/06/10/ 在5.7版本中,InnoDB实现了新的handler的records接口函数,当你需要表上的精确记录个数时,会直 ...
- mysql中的count(primary_key)、count(1)、count(*)的区别
表结构如下: mysql> show create table user\G; *************************** 1. row ********************** ...
- mysql SELECT FOUND_ROWS()与COUNT(*)用法区别
在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别 SEL ...
- php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)使用方法差别
在mysql中 FOUND_ROWS()与COUNT(*)都能够统计记录.假设都一样为什么会有两个这种函数呢.以下我来介绍SELECT FOUND_ROWS()与COUNT(*)使用方法差别 SELE ...
随机推荐
- MySQL + KeepAlived + LVS 单点写入主主同步高可用架构实验
分类: MySQL 架构设计 2013-05-08 01:40 5361人阅读 评论(8) 收藏 举报 mysql 高可用 keepalive ㈠ 实战环境 服务器名· IP OS MySQL odd ...
- 第2课:jmeter总结、Charles抓包
1. tps(throughput):每秒钟处理的事务数(请求数),定义与qps类似(qps:每秒完成的请求个数.) 响应时间(average):每个请求的平均响应时间 2. jmeter实现下载 ...
- kali linux下不能以root权限运行vlc的解决办法
习惯了在Linux下面使用VLC播放视频和音乐, 但是 VLC 的 linux 版本并不支持在root下面运行. 终端运行vlc命令报错,错误信息如下 root@kbdancer:~# vlc VLC ...
- php远程文件包含截断问题
今天在学习<白帽子讲web安全>一书是,提到一个php远程文件包含漏洞 可以从攻击者服务器中的一个写好的攻击脚本中远程执行命令 服务器中有漏洞的页面代码为: #test.php#error ...
- 04-python第四天学习
(1)for循环里的else In [1]: nums = [11,22,33,44] In [2]: for temp in nums: ...: print(temp) ...: else: #e ...
- 使用tr1的bind函数模板
最近把公司的VS2008统一升级为SP1了,虽然还是有些跟不上时代,毕竟C++17标准都出了,但是,对于成熟的商业软件开发而言,追求更新的C++标准肯定不是正道.升级SP1的VS2008可以支持TR1 ...
- iOS-----解决Prefix Header出错的问题
我们在使用 Prefix Header 预编译文件时有时会遇到如下的报错 clang: error: no such file or directory: '/Users/linus/Dropbox/ ...
- vuex秘籍
vue项目开发中,大型项目一般vuex所需要存储的状态一般都很都,这时,我们便需要进性模块化划分,然后 再页面中采用映射来实现state的调用: 目录一般如下: store为总的状态库存放文件. mo ...
- c# mysql and sqlserver数据库连接字符串
.net 项目访问sqlserver 和mysql 两种数据库时,连接字符串有些不一样 具体配置如下 <connectionStrings> <add name="mysq ...
- native 方法列表说明
方法列表说明 关于static const JNINativeMethod method_table[]方法列表的原型如下: typedef struct { const char* name; co ...