count

count(1) count() count(列名) 哪个性能高?
count(1)和count(
) 表示直接查询符合where条件的行数,而count(列名)表示查询的列名不为

空且符合where条件的行数。count(*)是要比count(1)性能高,因为它是标准语法,MySQL对它进行了

很多优化

count(*)的优化?

首先声明一点,优化的前提是使用count(*)时不带where和group by

- 对于myisam而言,因为它锁的粒度最小只有表锁,所以它不会有并发的行数据修改,故MySQL采用了一个字段进行存储它的行数
- 对于InnoDB而言,MySQL进行count(*) 时会选择一个最小非聚簇索引,因为count时他是不会关心你具体数据的,而非聚簇索引的叶子结点装的是主键ID,比聚簇索引小。所以建索引时,再建一个非聚簇索引也是必要的

count(列名)?
count(1)和count(*)只是扫描索引树,而count(列名)则需要进行全表扫描,如果列名不加索引

大数据量统计下,可以怎么优化count(*)

1.如果对count的精准要求不高,可以通过explain里的row代替

2.用一张表维护count,insert就+1,或者delete就 -1

3.用列式存储数据库,如click house