欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > MySQL高级-SQL优化- count 优化 - 尽量使用count(*)

MySQL高级-SQL优化- count 优化 - 尽量使用count(*)

2025/1/6 9:45:27 来源:https://blog.csdn.net/m0_65152767/article/details/140052693  浏览:    关键词:MySQL高级-SQL优化- count 优化 - 尽量使用count(*)

文章目录

  • 1、count 优化
  • 2、count的几种用法
  • 3、count(*)
  • 4、count(id)
  • 5、count(profession)
  • 6、count(null)
  • 7、 count(1)

1、count 优化

  • MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;
  • InnoDB引擎就麻烦了,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

优化思路:自己计数。

count(主键):InnoDB引擎会遍历整张表,把每一行的 主键id 值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)
count(字段):没有not null约束,InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。有not null约束,InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。
count(1):InnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字”1“进行,直接按行进行累加。
count(*):InnoDB引擎并不会把全部字段取出来,而是专门做了优化。不取值,服务层直接按行累加。

按照效率排序的话,count(字段)< count(主键id)< count(1)约等于 count(*),所有尽量使用count(*)。

2、count的几种用法

  • count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是null,累计值就加1,否则不加,最后返回累计值。
  • 用法:count(*)、count(主键)、count(字段)、count(1)

3、count(*)

mysql> select count(*) from tb_user;
+----------+
| count(*) |
+----------+
|       24 |
+----------+
1 row in set (0.00 sec)mysql>

4、count(id)

mysql> select count(id) from tb_user;
+-----------+
| count(id) |
+-----------+
|        24 |
+-----------+
1 row in set (0.00 sec)mysql>

5、count(profession)

mysql> select count(profession) from tb_user;
+-------------------+
| count(profession) |
+-------------------+
|                24 |
+-------------------+
1 row in set (0.00 sec)mysql> update tb_user set profession=null where id =24;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select count(profession) from tb_user;
+-------------------+
| count(profession) |
+-------------------+
|                23 |
+-------------------+
1 row in set (0.00 sec)mysql>

6、count(null)

mysql> select count(null) from tb_user;
+-------------+
| count(null) |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)mysql>

7、 count(1)

mysql> select count(1) from tb_user;
+----------+
| count(1) |
+----------+
|       24 |
+----------+
1 row in set (0.00 sec)mysql>

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com