软件开发中,常用要用到分页、计算总数,数据量超过千万、上亿的时候,往往count 的需要超过 1s 的执行时间,甚至 3-5s,对于一个追求性能的前沿团队来说,这个不能忍啊!
为什么会慢?
mysql 会对所有符合的条件做一次扫描。
select count(*) from table_a where a = '%d' ...
如果 a=%d 的数据有 1000W 条,那么数据库就会扫描一次 1000W 条数据库。如果不带查询条件,那这种全表扫描将更可怕。
count(*) 和 count(1)、count(0)
count(expr) 为统计 expr 不为空的记录
count(*) 它会计算总行数,不管你字段是否有值都会列入计算范围。
coount(0),count(1) 没有差别,它会计算总行数
Example 1:
mysql> explain extended select count(*) from user;
...
1 row in set, 1 warning (0.34 sec)
mysql> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------+
| Note | 1003 | select count(0) AS `count(*)` from `user` |
Example 2:
mysql> select count(*) from login_log
-> ;
+----------+
| count(*) |
+----------+
| 2513 |
+----------+
1 rows in set (0.00 sec)
mysql> select c