mysql count(*)的性能如何?
文章目录
- 为什么会出现这种情况呢?
- 如何优化count(*)性能?
-
- 增加redis缓存
- 加二级缓存
- 多线程执行
- 减少join的表
- 改成ClickHouse
- count的各种用法性能对比
为什么会出现这种情况呢?
在Mysql中,count(*)的作用是统计表中记录的总行数。
而count()的性能跟存储引擎有直接关系,并非所有的存储引擎,count()的性能都很差。
在Mysql中使用最多的存储引擎是:innodb和myisam。
在myisam中会把总行数保存到磁盘上,使用count(*)时,只需要返回那个数据即可,无需额外的计算,所以执行效率很高。
而innodb则不同,由于它支持事务,有MVCC(即多版本并发控制)的存在,在同一个时间点的不同事务中,同一条查询sql,返回的记录行数可能是不确定的。
在innodb使用count(*)时,需要从存储引擎中一行行的读出数据,然后累加起来,所以执行效率很低。
如果表中数据量小还好,一旦表中数据量很大