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

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. 转载:【Oracle 集群】RAC知识图文详细教程(一)--集群概念介绍

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  2. vue.js 源代码学习笔记 ----- core array.js

    /* * not type checking this file because flow doesn't play well with * dynamically accessing methods ...

  3. css移动元素的几种方法

    一.当然是元素设定为postion: absolute, 然后控制 left, top 位置 二.元素增加overflow属性,然后设置元素的scrollLeft, scrollRight当做滚动条来 ...

  4. 浅析Symbol

    不知道大家有没有留意ES6中的Symbol函数?在此之前,我对Symbol的认识知识这样的:  一.Symbol()和Symbol.for('str') Symbol()是独一无二的,你无法创建两个相 ...

  5. 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历

    日历 日历可以单独应用于规则中,也可以和timer结合使用在规则中使用.通过属性calendars来定义日历.如果是多个日历,则不同日历之间用逗号进行分割. 在Drools中,日历的概念只是将日历属性 ...

  6. 你离BAT之间,只差这一套Java面试题

    最近,各大公司开始了春招,很多人已经开始在准备面试了,特地来总结下初中级程序员应该掌握的面试题目.这篇面试指南,只适用于初中级程序员,其中不涉及分布式等问题.关于中高级的程序员问题,我后面可能再出一篇 ...

  7. HTTP 1.1 协议规范

    1. 内容协商 请求一个特殊编码的过程在 HTTP 1.1 规范中称为内容协商:

  8. Sublime 笔记

    1. 安装PackageControl 官网:https://packagecontrol.io/ v2: import urllib2,os,hashlib; h = '2915d1851351e5 ...

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

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

  10. 【转载】分布式之redis复习精讲

    注: 本篇文章转自:分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一 ...