Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL千万级数据count(*)查询太慢

MySQL千万级数据count(*)查询太慢怎么办?优化技巧分享

作者:程序员一只长毛橘

在MySQL中面对千万级数据使用count(*)查询总数时,InnoDB引擎会逐行扫描导致性能瓶颈,本文分享实战优化经验,教你如何通过选择辅助索引、拆解复合索引为单列索引等方式,将查询时间从120秒大幅缩短至3秒,提升查询效率

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

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

例如:

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

在MySQL中不同的存储引擎对于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 = ''

以上是我测试通过,并且实际生产的优化。

总结

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文