前言
最近我在公司优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。
我们使用的数据库是Mysql8
,使用的存储引擎是Innodb
。这次优化除了优化索引
之外,更多的是在优化count(*)
。
通常情况下,分页接口一般会查询两次数据库,第一次是获取具体数据,第二次是获取总的记录行数,然后把结果整合之后,再返回。
查询具体数据的sql,比如是这样的:`
select id,name from user limit 1,20;
它没有性能问题。
但另外一条使用count(*)查询总记录行数的sql,例如:
select count(*) from user;
却存在性能差的问题。
为什么会出现这种情况呢?
1 count(*)为什么性能差?
在Mysql中,count(*)
的作用是统计表中记录的总行数。
而count(*)
的性能跟存储引擎有直接关系,并非所有的存储引擎,count(*)
的性能都很差。
在Mysql中使用最多的存储引擎是:innodb
和myisam
。
在myisam中会把总行数保存到磁盘上,使用count(*)时,只需要返回那个数据即可,无需额外的计算,所以执行效率很高。
而innodb则不同,由于它支持事务&#x