龙空技术网

MySQL COUNT性能分析

DifferentJava 257

前言:

现时大家对“mysql累计值”大约比较着重,同学们都需要了解一些“mysql累计值”的相关知识。那么小编也在网摘上汇集了一些有关“mysql累计值””的相关资讯,希望同学们能喜欢,大家快快来学习一下吧!

count(*)是如何实现的?

上述的count(*)指的是在查询的时候不加where条件,不加where条件的count(*)在不同的数据库引擎下有不同的实现:

MyISAM引擎,会将表的总行数记录在磁盘上,因此count(*)会直接返回个数,效率较高InnoDB引擎,则是需要一行一行的从引擎中读出来,然后累计计数

InnoDB为什么不把总行数存起来?

由于InnoDB的事务支持,同一时刻的多个事务的查询,由于多版本并发控制的(MVCC)的原因,InnoDB表返回的行数是不确定。

InnoDB对COUNT(*)做的优化?

InnoDB是索引组织表,所有的数据都是通过B+数的方式组织起来的,主键索引的叶子节点是整行数据,普通索引的叶子节点是主键值,因此普通索引树的大小要比主键索引树小的多。对于count(*),MySQL优化器会找到最小的那棵索引树然后进行遍历。

如果某张大表需要经常性的进行count(*)操作,可以考虑单独建立一张表进行保存大表的记录行数。

COUNT的具体含义?

COUNT()是一个聚合函数,对于返回的结果集需要一行一行的进行判断,如果COUNT函数中的参数不为NULL,累计值就加,否则不加。

COUNT的几种用法?

COUNT(*)COUNT(主键ID)COUNT(1)COUNT(字段)

COUNT(*)除了在选择索引树遍历上有优化,而且在执行的过程中不会取值,Server层按照行累加。

COUNT(主键ID),InnoDB会遍历整张表,把每一行的ID值都取出来,返回给Server层。Server层拿到ID以后,判断不可能为空,按行累加。

COUNT(1),InnoDB引擎遍历整张表,但不取值。Server层对于返回的每一行放一个数字"1"进去,判断不可能为空,按行累加。

COUNT(字段),如果字段定义为NOT NULL的话,Server层从记录中取到字段以后判断不可能为NULL,按行累加;但是如果字段允许为NULL,Server层就有可能取到为NULL的记录,此时需要把记录中的值进行判断一下,不是NULL才可以累加。

COUNT效率

COUNT(字段) < COUNT(主键ID) < COUNT(1) ≈ COUNT(*)

标签: #mysql累计值