当前位置: 代码网 > it编程>数据库>Mysql > MySQL千万级数据count(*)查询太慢怎么办?优化技巧分享

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

2026年07月25日 Mysql 我要评论
mysql中 select count(*) 千万级别数据查询我们在实际开发过程中常常会用遇到查询表中数据总数,或者携带where条件的查询总数,而使用count(*)的时候会很影响查询效率的,例如:

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 = ''

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

总结

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com