天天看点

count(1)比count(*)效率高?

SELECT COUNT(*) FROM table_name

是个再常见不过的统计需求了。

本文带你了解下

Mysql

COUNT

函数。

一、

COUNT

函数

关于

COUNT

函数,在

MySQL

官网中有详细介绍:

翻译一下:

  1. COUNT(expr)

    ,返回

    SELECT

    语句检索的行中

    expr

    的值不为

    NULL

    的数量,结果是一个

    BIGINT

    值。
  2. 如果查询结果没有命中任何记录,则返回
  3. COUNT(*)

    的统计结果中,会包含值为

    NULL

    的行数。

在《阿里巴巴Java开发手册》也有如下要求:

二、

COUNT(列名)

COUNT(常量)

COUNT(*)

前面我们提到过

COUNT(expr)

用于做行数统计,那么

COUNT(列名)

COUNT(常量)

COUNT(*)

这三种语法中,

expr

分别是列名、 常量 和

*

2.1

COUNT(*)

COUNT(常量)

在列名、常量和

*

这三个条件中,常量是一个固定值,肯定不为

NULL

*

可以理解为查询整行,所以肯定也不为

NULL

,那么就只有列名的查询结果可能是

NULL

所以,

COUNT(常量)

COUNT(*)

表示的是直接查询符合条件的数据库表的行数。而

COUNT(列名)

表示的是查询符合条件的列的值不为

NULL

2.2

COUNT(*)

COUNT(1)

区别

COUNT(1)

就是

COUNT(常量)

,对于这二者到底有没有区别:

  1. 有的说

    COUNT(*)

    执行时会转换成

    COUNT(1)

    ,所以

    COUNT(1)

    少了转换步骤,所以更快。
  2. 还有的说,因为

    MySQL

    针对

    COUNT(*)

    做了特殊优化,所以

    COUNT(*)

    更快。

到底哪种说法是对的?看下

MySQL

官方文档:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
           

通过文档,对于

COUNT(1)

COUNT(*)

MySQL

的优化是完全一样的,根本不存在谁比谁快!

2.3

COUNT(列名)

相较于前两者,

COUNT(列名)

的查询就比较简单粗暴了,就是进行全表扫描,然后判断指定字段的值是不是为

NULL

,不为

NULL

则累加。

相比

COUNT(*)

COUNT(列名)

多了一个步骤就是判断所查询的字段是否为

NULL

,所以他的性能要比

COUNT(*)

慢。

here和group的条件查询。

2.4

SQL92

除了查询得到结果集有区别之外,

COUNT(*)

COUNT(常量)

COUNT(列名)

来讲,

COUNT(*)

SQL92

定义的标准统计行数的语法,因为他是标准语法,所以

MySQL

数据库对他进行过很多优化。

SQL92

,是数据库的一个

ANSI/ISO

标准。它定义了一种语言(

SQL

)以及数据库的行为(事务、隔离级别等)。

2.5

COUNT(*)

优化

因为

COUNT(*)

SQL92

定义的标准统计行数的语法,所以

MySQ

L对其进行了很多优化:

  1. MyISAM

    中会直接把表的总行数单独记录下来供

    COUNT(*)

    查询
  2. InnoDB

    会在扫表的时候选择最小的索引来降低成本。
这些优化的前提都是没有进行

where

group

的条件查询,更多请参考MySQL 全表 COUNT(*) 简述

三、总结

COUNT

函数用于统计表行数,按照效率比较的话:

count(*)=count(常量)>count(列名)
           

3.1 小建议

既然

count(*)

在查询上依赖于所有的数据集,所以我们在设计上也需要尽量的规避全量

count

通常情况我们针对可预见的

count

查询会做适当的缓存,可以是

Redis

,也可以是独立的

MySQL

count

表。

3.2 技术交流

  1. 风尘博客
  2. 风尘博客-掘金
  3. 风尘博客-博客园
  4. Github

技术交流,欢迎扫一扫!

继续阅读