MySQL进阶45讲【14】count(*)这么慢,该怎么办? 骑猪看日落 2024-05-07 22:32 64阅读 0赞 ## 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一样,也把数字存起来呢? <
相关 MySQL进阶45讲【18】为什么只查一行的语句,也执行这么慢? MySQL进阶45讲【18】为什么只查一行的语句,也执行这么慢? 今天药忘吃喽~/ 2024年05月11日 09:27/ 0 赞/ 77 阅读
相关 MySQL进阶45讲【14】count(*)这么慢,该怎么办? MySQL进阶45讲【14】count(*)这么慢,该怎么办? 骑猪看日落/ 2024年05月07日 22:32/ 0 赞/ 65 阅读
相关 MySQL进阶45讲【38】insert语句的锁为什么这么多? MySQL进阶45讲【38】insert语句的锁为什么这么多? 爱被打了一巴掌/ 2024年05月07日 22:28/ 0 赞/ 74 阅读
相关 为什么count(*)这么慢? 当我们查询一张数据量很大的表时,使用SQL: select count() from t1; 这条SQL非常耗时。那么当执行count(\)的时候发生了什么呢? 布满荆棘的人生/ 2023年03月13日 12:25/ 0 赞/ 200 阅读
相关 mysql进阶(二)14-30讲 1.mysql索引: 索引是帮助mysql高效获取数据的数据结构;(排好序的快速查找数据结构) ![70][]![70 1][] 如果索引字段是char类型,那么在 àì夳堔傛蜴生んèń/ 2022年05月19日 14:21/ 0 赞/ 145 阅读
还没有评论,来说两句吧...