聊一聊关于MySQL的count(*)
坚持更新Java技术栈相关总结,Java、MySQL、各种中间件等,关注公众号【阿丸笔记】获取第一时间更新。 收集技术相关电子书、面试题,有需要的小伙伴可以关注公众号【阿丸笔记】,无套路领取。 1. 背景 自从大家对于MySQL数据库的稳定性有了更高的追求后,经常有小伙伴有这样的疑问,对于count(*)这样的操作,有没有正确的姿势,或者有没有可以优化的地方? 但答案比较残酷,如果已经使用了正确的索引,那么基本上没有可以优化的地方。 一旦出现慢查询了,它就是慢查询了,要改,只能自己计数或者通过其他搜索平台来做。 今天,就一起来看看为什么会这样,并对大家日常会遇到的一些的困惑进行解答。 2. count(*)的实现方式 据说,MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高。 而我们的mysql一般都是用Innodb的引擎,Innodb是怎么实现count操作的呢? InnoDB 引擎就比较麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。 所以,当我们的表里面的记录越来越多的时候,count(*)就会越来越慢。 当然,我们这里说的都是不带where条件的,如果带上where条件的话,MyISAM也是很慢的。 3.正确的打开方式 嗯,首先还是说,mysql上不太推荐用count(*