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

 更新时间:2026年07月25日 09:24:14   作者:程序员一只长毛橘  
在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 引擎把一个表的总行数存在磁盘上,因此执行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 = ''

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

总结

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

相关文章

  • windows 10下解压版MySql安装配置方法教程

    windows 10下解压版MySql安装配置方法教程

    这篇文章主要为大家详细介绍了windows 10下解压版MySql安装配置方法教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • MySQL隔离级别和锁机制的深入讲解

    MySQL隔离级别和锁机制的深入讲解

    这篇文章主要给大家介绍了关于MySQL隔离级别和锁机制的相关资料,主要包括深入理解MySQL隔离级别和锁机制使用实例、应用技巧、基本知识点总结和需要注意事项,需要的朋友可以参考下
    2021-08-08
  • MySQL中order by的使用详情

    MySQL中order by的使用详情

    在使用select语句时可以结合order by对查询的数据进行排序。如果不使用order by默认情况下MySQL返回的数据集,与它在底层表中的顺序相同,可能与你添加数据到表中的顺序一致,也可能不一致,如果希望得到的数据有顺序,就该明确排序方式,下面详细内容需要的朋友可以参考一下
    2021-11-11
  • 如何恢复MYSQL的ROOT口令

    如何恢复MYSQL的ROOT口令

    如何恢复MYSQL的ROOT口令...
    2006-11-11
  • MySQL8.0高可用MIC的实现

    MySQL8.0高可用MIC的实现

    本文介绍了如何实现MySQL8.0高可用MIC,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • MySQL主从复制原理以及需要注意的地方

    MySQL主从复制原理以及需要注意的地方

    这篇文章主要介绍了MySQL主从复制原理以及需要注意的地方,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11
  • 一文详解如何基于mysql dump进行全量备份还原

    一文详解如何基于mysql dump进行全量备份还原

    在数据库管理中,数据备份和恢复是非常重要的环节,​​mysqldump​​ 是 MySQL 提供的一个非常强大的命令行工具,下面小编就和大家详细介绍一下吧
    2025-10-10
  • MySQL事务的隔离级别详情

    MySQL事务的隔离级别详情

    这篇文章主要介绍了MySQL事务的隔离级别详情,事务隔离级别越高,为避免冲突所花费的性能也就越多,即效率低。在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别
    2022-07-07
  • MySQL中如何求平均值常见实例(AVG函数详解)

    MySQL中如何求平均值常见实例(AVG函数详解)

    MySQL avg()是一个聚合函数,用于返回各种记录中表达式的平均值,这篇文章主要介绍了MySQL中用AVG函数如何求平均值的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • MySQL5.7.16绿色版安装教程详解

    MySQL5.7.16绿色版安装教程详解

    这篇文章主要介绍了MySQL5.7.16绿色版安装教程详解的相关资料,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-10-10

最新评论