MySQL中 select count(*) 千万级别数据查询

我们在实际开发过程中常常会用遇到查询表中数据总数,或者携带where条件的查询总数,而使用count(*)的时候会很影响查询效率的,

例如

select count(*) from table 
select count(*) from table where id = '' and column = ''

在MySQL中不同的存储引擎对于count(*)有不同的实现方式。

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

当然,如果MyISAM后面也加上where条件的话,MyISAM也没有那么快,我们在实际开发中,多数都需要事务,所以建表都会选择InnoDB。

使用count(*) 的时候

1,一定需要走索引,能走辅助索引 (选择表中列较短的创建一个普通索引) 就走辅助索引,不能走也建议创建一个辅助索引。

ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 

使用索引和不使用索引查询数据真不是一样的。

2,如果使用count(*)建议一定是单表查询,所以建表的时候,希望有所考虑。
3,建议表中取消掉复合索引(组合索引) ,把复合索引拆解成普通索引(单列索引)

在这里插入图片描述
图片中复合索引,可拆解成普通索引,这样做的意义是,count(*) 在MySQL中会被进行优化,会走索引较短的列进行查询,如果是这种复合索引的话,我测试过3200W的数据大概需要120秒,而走单列索引的话只需要3秒。

建议需要使用count(*) 的话,用explain来查看是否走了索引,走了那一个索引,如果是复合索引,请修改成普通索引,在进行查询

explain select count(*) from table 
explain select count(*) from table where id = '' and column = ''

以上是我测试通过,并且实际生产的优化。在此记录遇见问题可回看,也希望能帮助到你。

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐