当前位置:   article > 正文

MySQL进阶45讲【14】count(*)这么慢,该怎么办?_count(*)这么慢,我该怎么办

count(*)这么慢,我该怎么办

1 前言

在开发系统的时候,可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候大家可能会想,一条select count(*) from t 语句不就解决了吗?

但是,随着系统中记录数越来越多,这条语句执行得也会越来越慢。有些小伙伴可能就想了,MySQL怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。

那么今天,我们就来聊聊count(*)语句到底是怎样实现的,以及MySQL为什么会这么实现。如果应用中有这种频繁变更并需要统计表行数的需求,业务设计上可以怎么做。

2 count(*)的实现方式

首先要明确的是,在不同的MySQL引擎中,count(*)有不同的实现方式。

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

这里需要注意的是,我们在这篇文章里讨论的是没有过滤条件的count(*),如果加了where 条件的话,MyISAM表也是不能返回得这么快的。

在前面的文章中,我们一起分析了为什么要使用InnoDB,因为不论是在事务支持、并发能力还是在数据安全方面,InnoDB都优于MyISAM。如果小伙伴们的表也用了InnoDB,这就是当记录数越来越多的时候,计算一个表的总行数会越来越慢的原因。

那为什么InnoDB不跟MyISAM一样,也把数字存起来呢?

<
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/545029
推荐阅读
相关标签
  

闽ICP备14008679号