count优化

count说明

count(a) 和 count(*)

当 count 统计某一列时,比如count(a),a 表示列名,是不统计 null 的。

count(*)无论是否包含空值,都会统计。

MyISAM/InnoDB count(*)

MyISAM:如果没有 where 子句,也没检索其它列,count(*)会非常快。 MyISAM 引擎会把表的总行数存在磁盘上。

InnoDB :不会保留表中的行数,因为并发事务可能同时读取到不同的行数。执行count(*)时都是临时去计算的,会比 MyISAM 慢很多。

MySQL 5.7.18 前后 count(*) 的区别

MySQL 5.7.18 之前,InnoDB 通过扫描聚簇索引来处理count(*)语句。

MySQL 5.7.18 开始,通过遍历最小的可用二级索引来处理 count(*)语句。

优化器基于成本的考虑,优先选择的是二级索引。所以count(主键) 其实没count (*)快。

count(1) count(*)

执行计划相同,速度没有明显差别

count 优化

1、show table status,Rows 这列就表示这张表的行数。

show table status like 't1';

估算值,可能与实际值相差 40% 到 50%。

2、用 Redis 做计数器

redis 和数据库访问存在时间先后,可能会读到错误的值。

3、增加计数表

维持了计数的准确性


   转载规则


《count优化》 wangyixin-tom 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
索引 索引
数据结构B 树B 树每个节点都包含 key 值和 data 值。 如果 data 比较大时,每一页存储的 key 会比较少; 当数据比较多时,要经历多层节点才能查询在叶子节点的数据。 B+ 树 所有叶子节点中包含了全部关键字的信息 各叶子节
2021-03-13
下一篇 
join优化 join优化
关联查询Nested-Loop Join思想 一次一行循环:从驱动表中读取行并取到关联字段,根据关联字段在被驱动表取出满足条件的行(使用索引),然后取两张表的结果合集。manual 在关联字段有索引时,才会使用 NLJ,如果没索引,就会使
2021-03-13
  目录