select COUNT 语句深入解释

Select count 只统计不是null的列数,所以count(列名),count(常量),count(*)的区别就是:

count(列名)中的列可能是null,于是不被统计入内

其余两个倒是统计所有符合条件的行数,且是标准的统计行数的方法,mysql已经做了一些优化,所以推荐

 

COUNT(*)的优化

区分为MyISAM和InnoDB两种引擎的区别。MyISAM是表级锁,且不支持事务,而InnoDB是行级锁,且支持事务。

由于MyISAM是表级锁,不会存在查询的时候并发对表行数的修改,故可以直接调用缓存下的表的行数。

而InnoDB是会在查询的时候,行数发生变化的,不可使用缓存行数。就会涉及查询的时候实时去扫表,InnoDB 8.0.13开始,扫表开始有一些有优化:

count(*)只关心条数,不关心内容,所以会选择低成本的索引扫表。当语句中没有where和group by条件时,InnoDB会使用聚簇索引(主键索引)和非聚簇索引(非主键索引)中的非聚簇索引。聚簇索引的叶子节点保存证行记录,而非聚簇索引只保留该行记录的主键值。所以相比之下,非聚簇索引的成本低很多,MySql会优先选择最小的非聚簇索引来扫表。因此建表的时候,除了主键索引,非主键索引也是很必要的。

以上优化的条件是当查询语句中不存在where 和group by的时候

 

COUNT(*)和COUNT(1)

MYSQL官方文档是说InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

COUNT(字段)

count(字段)会判断列值是不是null,所以性能会低于count(*)

 

posted @ 2019-10-21 11:02  yc5518  阅读(2886)  评论(0编辑  收藏  举报