mysql select count 非常慢

MySQL select count 性能分析

问题:mysql 在count时发现非常慢

select count(*) from xxx;

无论执行多少次,查询速度基本稳定在10-12秒之间

环境说明

  1. windows11 x64
  2. SSD硬盘
  3. MySQL8.0.35
  4. 数据库引擎为InnoDB
  5. 数据行数不到3万行,但是数据量将近900M,这900M中包含了数据本身和索引。

思路

  1. 排除count(*) count(id)对性能的干扰。
  2. 经过show profile分析,在execute阶段有将近9秒多的时间。于是怀疑是io的问题。
  3. 修改innodb的buffer相关进行测试
mysql 复制代码
[mysqld]
# innodb_log_files_in_group 和innodb_log_file_size 8.0之后废弃
# 用innodb_redo_log_capacity代替,默认100M,最大128GB
innodb_redo_log_capacity=1G

# 三者之间的关系
# innodb_buffer_pool_size / innodb_buffer_pool_chunk_size = innodb_buffer_pool_instances
# win32系统: innodb_buffer_pool_chunk_size  默认为128M
# 其他系统: innodb_buffer_pool_size 小于1G时,innodb_buffer_pool_instances 默认为1
# 大于1G时。innodb_buffer_pool_instances 默认为8,取值范围 1-64
innodb_buffer_pool_chunk_size=512M
innodb_buffer_pool_instances=8
innodb_buffer_pool_size=4G
  1. show engine status\G查看buffer pool中描述(buffer pool的数量是 上面的instances数量对应)
    关注 free buffers 有0的情况, 如果有,考虑buffer_size太小
  2. show status like '%buffer%';查看
mysql 复制代码
#从内存读取的大小
Innodb_buffer_pool_read_requests

#无法满足内存读取,从磁盘读取的大小
Innodb_buffer_pool_reads

#计数器,计算innodb需要创建页面的次数,大于0时,考虑buffer_size太小        
Innodb_buffer_pool_wait_free    

buffer命中率 = innodb_buffer_pool_read_requests / (innodb_buffer_pool_read_requests + innodb_buffer_pool_reads) * 100

根据4,5步骤的情况,修改了innodb_buffer_pool_size结果查询时,第一次时长为10多秒,后续每次查询稳定在0.01秒,和之前比,相关与多了一次缓存?

我对比了下openEuler系统上同样数据库的同样操作,第一次不到2秒,后续每次0.01秒

对比了下innodb的所有参数,除过上述提到的buffer_pool的三个参数被修改过,其他都一致

有那个英雄路过时,麻烦留言指点下问题出在哪里

相关推荐
这个DBA有点耶9 小时前
从症状到根因:数据库监控指标的分层方法与静态/动态阈值策略
数据库·mysql·代码规范
ProcessOn11 小时前
纯干货!MySql实战02:一条SQL更新语句执行流程大探索!
sql·mysql·sql server
这个DBA有点耶12 小时前
DELETE没删多少数据,表却越来越大——InnoDB删除空洞与页合并失效的根因
数据库·mysql·代码规范
小羊没烦恼!16 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
黄俊懿16 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
geovindu16 小时前
sql: JSON and XML Data Handling in SQL using mysql 9.0
数据库·sql·mysql·数据库开发
Mortalbreeze16 小时前
MySQL 基础篇(九):从 B+ 树到索引优化,全面理解 MySQL 索引
数据库·mysql
猫咪很可爱16 小时前
mysqldump 失败常见场景
数据库·sql·mysql
1024奇点17 小时前
【仓颉语言入门 · 第二篇 第 8 课】
开发语言·数据库·ide·mysql·开源
步步为营DotNet18 小时前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime