在面试的时候我们会经常遇到这个问题:

MySQL 中,COUNT(*)、COUNT(1)、COUNT(col) 有区别吗?

有区别。

接下来我们分析一下这三者有什么样的区别。

一、SQL Syntax & Semantics

从语义角度看,它们有不同的含义。

COUNT(expr)返回查询到的行中 expr is not-NULL 的个数,返回类型为 BIGINT(8 bytes)。

Returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement. The result is a BIGINT value.

COUNT(*) 有点不同,它返回查询到的结果集中的行的个数,不论这些行是否含有 NULL 值。

COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.

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)?

COUNT(expr)

Restrictions on InnoDB Tables

MySQL COUNT(*) & COUNT(1) & COUNT(col) 比较分析的更多相关文章

  1. 【MySQL】技巧 之 count(*)、count(1)、count(col)

    只看结果的话,Select Count(*) 和 Select Count(1) 两着返回结果是一样的. 假如表沒有主键(Primary key), 那么count(1)比count(*)快,如果有主 ...

  2. mysql技巧之select count的比较

        在工作过程中,时不时会有开发咨询几种select count()的区别,我总会告诉他们使用select count(*) 就好.下文我会展示几种sql的执行计划来说明为啥是这样.   1.测试 ...

  3. MySQL查询count(*)、count(1)、count(field)的区别收集

    经过查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*).count(1).count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会 ...

  4. mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化

    原文:mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化 问题描述 mysql 5.7 innodb 引擎 使用以下几种方法进行统计效率差不 ...

  5. 慕课网 性能优化之MySQL优化--- max 和count的性能优化

    注:在执行SQL语句前加上explain可以查看MySQL的执行计划 数据库:MySQL官方提供的sakila数据库 Max优化: 例如:查询最后支付时间 explain select max(pay ...

  6. MySQL · 引擎特性 · InnoDB COUNT(*) 优化(?)

    http://mysql.taobao.org/monthly/2016/06/10/ 在5.7版本中,InnoDB实现了新的handler的records接口函数,当你需要表上的精确记录个数时,会直 ...

  7. mysql中的count(primary_key)、count(1)、count(*)的区别

    表结构如下: mysql> show create table user\G; *************************** 1. row ********************** ...

  8. mysql SELECT FOUND_ROWS()与COUNT(*)用法区别

    在mysql中 FOUND_ROWS()与COUNT(*)都可以统计记录,如果都一样为什么会有两个这样的函数呢,下面我来介绍SELECT FOUND_ROWS()与COUNT(*)用法区别   SEL ...

  9. php学习之道:mysql SELECT FOUND_ROWS()与COUNT(*)使用方法差别

    在mysql中 FOUND_ROWS()与COUNT(*)都能够统计记录.假设都一样为什么会有两个这种函数呢.以下我来介绍SELECT FOUND_ROWS()与COUNT(*)使用方法差别 SELE ...

随机推荐

  1. LINUX文件的权限

    一.权限设定的意义:系统最底层安全设定方法之,保证文件可以被可用的用户做相应操作. 二.文件权限的查看(alias) 命令:ls ls -l file ## 查看文件属性 ls -ld mkdir   ...

  2. vscode 实用插件

    1.Auto Rename Tag,非常实用!要修改标签名称的时候自动修改结束标签,节省一半时间,提升效率,非常棒! 2.vscode-icon,这款必须要推荐,明显提升效率的小插件,在项目文件多类型 ...

  3. Buildroot构建指南——工具链

    Linux系统的交叉编译工具链用来将源代码变成bin文件或者库文件的一个软件.一般大家默认工具链等于gcc或者arm-linux-gcc,但是实际上,gcc只是工具链的编译器部分,不是全部,制作一个工 ...

  4. jq的attr、prop和data区别

    prop()获取在匹配的元素集中的第一个元素的属性值. 大家都知道有的浏览器只要写disabled,checked就可以了,而有的要写成disabled = "disabled", ...

  5. [AirFlow]AirFlow使用指南二 DAG定义文件

    1. Example """ Code that goes along with the Airflow tutorial located at: https://git ...

  6. Ubuntu与ROS的Docker桌面系统与ROS在线练习课程(在线Linux虚拟机)

    ROS在线练习课程正在逐步完善中,目前以ROS官网中文资料制作,可参考: https://www.shiyanlou.com/courses/854  邀请码 U23ERF8H 安装Ubuntu+RO ...

  7. NSArray中的对象进行排序

    看在iOS中有哪些方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor进行排序 使用selector进行排序 小引 我们将要 ...

  8. 跟踪Makefile输出调试信息

    /********************************************************************* * 跟踪Makefile输出调试信息 * 说明: * 有时 ...

  9. 【剑指offer】08二叉树的下一个节点,C++实现

    原创博文,转载请注明出处! # 题目 父节点指向子节点的指针用实线表示,从子节点指向父节点的指针用虚线表示. # 思路 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点.例如,寻找b的下一 ...

  10. SQL Server Profiler 跟踪远程服务器的语句

    同事测试软件报错,想连Ta的数据库跟踪下语句,结果提示:      对比了下自己的探查器设置,勾选几个事件就可以了: