MySQL之COUNT性能到底如何?
- 前言
- 1.COUNT(1)、COUNT(*)与COUNT(字段)哪个更快?
- 2.COUNT(*)与TABLES_ROWS
- 3.COUNT(*)是怎么样执行的?
- 4.总结
前言
在实际开发过程中,统计一个表的数据量是经常遇到的需求,用来统计数据库表的行数都会使用COUNT(*)
,COUNT(1)
或者COUNT(字段)
,但是表中的记录越来越多,使用COUNT(*)
也会变得越来越慢,本文我们就来分析一下COUNT
的性能到底如何。
1.COUNT(1)、COUNT(*)与COUNT(字段)哪个更快?
执行效果:
- COUNT(*)MySQL 对COUNT(*)进行了优化,COUNT(*)直接扫描主键索引记录,并不会把全部字段取出来,直接按行累加。
- COUNT(1)InnoDB引擎遍历整张表,但不取值,server 层对于返回的每一行,放一个数字“1”进去,按行累加。
- COUNT(字段)如果这个“字段”是定义为NOT NULL,那么InnoDB 引擎会一行行地从记录里面读出这个字段,server 层判断不能为NULL,按行累加;如果这个“字段”定义允许为NULL,那么InnoDB 引擎会一行行地从记录里面读出这个字段,然后把值取出来再判断一下,不是 NULL才累加。
实验分析
- 本文测试使用的环境:
[root@zhyno1 ~]# cat /etc/system-releaseCentOS Linux release 7.9.2009 (Core)[root@zhyno1 ~]# uname -aLinux zhyno1 3.10.0-1160.62.1.el7.x86_64 #1 SMP Tue Apr 5 16:57:59 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux