count(*)、count(常量)、count(列名)

1、count(*)和count(常量)和count(列名)之间的区别?

count(*):符合条件的行数,标准统计行数的语法;

count(常量):符合条件的行数;

count(列名):符合条件 && 该列值不为null的行数。

2、MyISAM:

表锁(不会发生并发修改表行数问题),维护一个变量保存表总行数;

count(*):直接将该值返回,前提:不能有where子句

MySQL官方文档:

For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause. For example:

SELECT COUNT(*) FROM student;

对于MyISAM表,如果SELECT从一个表中检索,没有其他列被检索,并且没有WHERE子句,则COUNT(*)被优化以非常快地返回。

count(常量):如果满足前提条件,则和count(*)一样,前提条件如下。

MySQL官方文档:

This optimization only applies to MyISAM tables, because an exact row count is stored for this storage engine and can be accessed very quickly. COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.

此优化仅适用于MyISAM表,因为该存储引擎存储了确切的行数,并且可以非常快速地对其进行访问。如果第一列定义为NOT NULL,则仅对COUNT(1)进行相同的优化

count(列名):需要判断该列是否为null,性能没有count(*)好。

3、InnoDB:

全表扫描。

行锁,支持事务;

count(*):使用开销较小的索引来统计行数。

如果表中只有主键索引,则会使用主键索引统计行数;如果除了主键索引还有二级索引,则会使用二级索引统计行数。

原理:InnoDB的索引分为主键索引(包含key、key以外的信息)和非主键索引(key和主键id);所以主键索引会比非主键索引更大,在每次IO读取的数据量一定的前提下,为了减少IO次数,则选用非主键索引IO次数更少,即:开销更小。

count(常量):和count(*)是一样的,没有哪个更快。推荐使用count(*),标准统计行数的语法。

MySQL官方文档:

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

InnoDB以相同的方式处理SELECT COUNT(*)和SELECT COUNT(1)操作。没有性能差异

count(列名):需要判断该列是否为null,性能没有count(*)好。

posted @ 2019-11-04 22:43  嘿咻、晚安喵  阅读(623)  评论(0)    收藏  举报