你真的了解 count(*) 的底层原理吗?

时间:2024-10-23 16:38:01

目录标题

  • 1. count(*) 的原理
    • 1.1 使用缓存计数可以吗?
  • 2. count(*)、count(主键)、count(字段) 和 count(1) 该选谁?
  • 3. 总结

在这里插入图片描述

在现实工作中,我们经常会遇见统计的场景,例如统计订单的数量、统计数据表中有多少条数据、统计用户的数量,等等。遇到这些场景,你可能会不屑地说:“这还不简单吗?使用一个 count(*) 就可以解决!”

但比较尴尬的是,你经常会发现,当需要统计的数据越来越多的时候,使用 count() 会变得越来越慢。这是为什么呢?下面我们就一起来聊聊 count() 的底层原理。

1. count(*) 的原理

在 MySQL 中,count(*) 的作用理论上是统计相关数据的行数,不过数据过多的时候统计速度很慢。这个时候我们很容易就能想到,我们单独用一个字段来记录行数就可以完美地解决这个问题。这是可以的,事实上 MySQL 中的 MyISAM 存储引擎中就存有这样的数据。具体如下:

mysql> select table_name,table_rows from tables where TABLE_SCHEMA='test01' AND table_name = 'city';
+------------+------------+
| table_name | table_rows |
+------------+------------+
| city       | 3          |
+------------+------------+
1 row in set (0.00 sec)

这种方法的查询速度虽然很快,但是有局限性。

  • 局限性一:就是当只需要统计某部分数据的时候仍然需要一行一行地进行统计,因为硬盘中只存放总行数这一个数据,没有进行筛选,这个统计的过程仍然很