01.29 Day 10 - 获得表行数的方法

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 10 天,也是我第 55 次进行这种操作。

今天我温习了该专栏里一篇叫《count(*)这么慢,我该怎么办?》的文章。

关键词总结:count(*) 的实现方式(MyISAM、InnoDB、不支持事务、不准确、性能问题)、用缓存系统保存计数、在数据库保存计数、不同的 count 用法(count(主键 id)、count(1)、count(字段)、count(*)、按效率排列)。

所学总结:

count(*) 的实现方式

MyISAM

把表的总行数存储在磁盘上,执行 count(*) 是会直接返回统计,效率很高。

InnoDB

执行 count(*) 时需要把数据逐行地从引擎里读出再累加。

不支持事务

MyIASM 表很快但不支持事务。

不准确

show table status 命令虽然很快,但不准确。

性能问题

InnoDB 表会遍历全表,结果准确但性能不佳。
 

用缓存系统保存计数

统计数据会有丢失以及不精确的问题。
 

在数据库保存计数

通过事务来确保逻辑上是一致的。
 

不同的 count 用法

count(主键 id)

InnoDB 遍历整张表,将 id 的值都取出返回给 server 层。server 层判断 id 后判断不可能为空就按行累加。

count(1)

InnoDB 遍历整张表但不取值。server 层将数字 “1” 放入返回的行,随后判断是不可能为空按行累加。

count(字段)

  • 如果字段不允许 null,则逐行地读取,判断不能为 null,逐行累加;
  • 如果字段允许 null,判断到有可能是 null 时要取出值再次判断,不是 null 时才累加。

count(*)

并不会读出多有字段,而是做了优化,不取值。肯定不是 null,按行累加。

按效率排列

count(字段) < count(主键 id) < count(1) ≈ count(*)
 

末了

重新总结了一下文中提到的内容:获得表行数的两种方法、不同引擎中 count(*) 的实现、缓存系统统计存在问题、InnoDB 解决了一致性视图的问题、利用事务的原子性和隔离性以简化在业务开发时的逻辑。

发布了103 篇原创文章 · 获赞 6 · 访问量 5067

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104104265