mysql的count() 函数操作分析与选择

开发过程中有时候会使用到以下sql计算数据库中某个表的行数,但随着数据越来越多就会变得很慢

select count(*) from T 

count(*) 的实现方式

MySQL 引擎有MyISAM 、InnoDB,它们有不同的实现方式

MyISAM:把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;但是不支持事务;如果加了 where 条件的话, 效率就低了

InnoDB:把数据一行一行地从引擎里面读出来,然后累积计数;支出事务

不同的 count 用法性能、差别

mysql从MysqL5.5版本开始,默认引擎是InnoDB,所以在此分析的是InnoDB引擎

count(主键):遍历整张表,把每一行的 id 值都取出来,判断是不可能为空的,就按行累加。

count(字段)

  1. 如果这个“字段”是定义为不为空(is not null) 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;

  1. 如果这个“字段”定义允许为空(is null),那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。

count(1): 遍历整张表,但不取值。返回的每一行都放一个“1”进去,判断是不可能为空的,按行累加。

count(*):mysql对count(*)有优化,认为是取行数,不需要把字段取出来,所以count(*) 肯定不是 null,不会去判断是否为空,按行累加

结论:

count(字段)

mysql知识点补充:

binlog(归档日志)和 redo log(重做日志)两阶段提交,作用:MySQL 异常重启时保证数据完整性;流程示意图如下:

mysql的count() 函数操作分析与选择_第1张图片

你可能感兴趣的:(学习总结,sql,java)