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 ...
随机推荐
- nodejs编译sass模块包 node-compass,与gulp包gulp-sass使用方法
简介:node express或者就是node项目中,要自动编译sass方法很多,比如gulp 比如考拉,比如今天我想说的这个包node-compass. 编译sass的三种方法: 前提条件: 都需要 ...
- Pavilion M4-1016TX 加装固态硬盘(SSD)+UEFI+GPT安装WIN8.1
折腾了一天,终于将电脑加上SSD和装上系统,记录下,方便后面忘记使用. 步骤: 1.Pavilion M4-1016TX内置了mSata的接口,大小是全高的.ssd支持大小官方说法是测试过32g的,目 ...
- web服务器无法显示font-awesome字体图标
今天遇到了在本地运行网页 一切调用的额font的小图标都OK的,但是把网页发布到tomcat服务器上面就不行了 之后百度了下,找到了解决方法,遂记录下,方法如下: 在web.xml 文件中加上: &l ...
- 一道简单的JavaScript面试题
好久没更新博客了,随便写点东西吧. 自从工作之后就特别忙,忙的过程中有时候挺迷茫的,可能是大多数时候写的都是简单的业务代码,很久没好好充电了.最近一直在零碎的上班路上等电梯时间里面学习<图解HT ...
- Linux下系统的定时及延时任务
一.系统的延时 是临时的.对系统做的任务指定一个时间点.发起的命令是at at 时间点(now+1min) ## 设定任务实行时间 at> 执行命令 ...
- python编程(最简单的rpc代码)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 采用twisted可以编写最简单的rpc代码. server端代码如下, from twiste ...
- Recording︱有价值的各类AI、机器学习比赛心得、经验抄录
今年kaggle华人优胜团队很多,所以经验.心得不少,都是干货慢慢收集. 一.[干货]Kaggle 数据挖掘比赛经验分享 github:https://github.com/ChenglongChen ...
- 机器人操作系统(ROS)在线实训平台学习实验指南
机器人操作系统(ROS)在线学习指南 在高校开设ROS相关课程已经积累了一年多的经验,由于自动化类专业在课程安排中不同于计算机相关专业,通常没有Linux相关的课程基础,直接上手ROS较为 ...
- Linux下的Maven安装与配置
关于Maven的介绍可以参考:Maven详解 这篇在原理上讲得比较详细,在安装上是windows版本的,这里补上linux下的安装和配置: 1.下载maven安装包 http://maven.apac ...
- Java:浅克隆(shallow clone)与深克隆(deep clone)
Summary 浅克隆与深克隆对于JavaSE来说,是个难度系数比较低的概念,但不应该轻视它. 假设一个场景:对于某个list,代码里并没有任何对其的直接操作,但里面的元素的属性却被改变了,这可能就涉 ...