目录标题
- 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)
这种方法的查询速度虽然很快,但是有局限性。
- 局限性一:就是当只需要统计某部分数据的时候仍然需要一行一行地进行统计,因为硬盘中只存放总行数这一个数据,没有进行筛选,这个统计的过程仍然很