使用温InnoDB缓冲池启动MySQL测试

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 使用温InnoDB缓冲池启动MySQL测试

​1.首先我们看看InnoDB的架构图,应用访问数据库的时候,数据库从硬盘读取表空间的数据块写入内存的Buffer Pool.

innodb_buffer_pool动画.gif
[点击并拖拽以移动]

2.这是一个没有应用访问的MySQL实例的缓存池数据

MySQL localhost SQL > select @@GLOBAL.innodb_page_size;
+---------------------------+
| @@GLOBAL.innodb_page_size |
+---------------------------+
|16384 |
+---------------------------+
1 row in set (0.0006 sec)

MySQL localhost SQL > SELECT table_name,COUNT(*) AS pages,round( sum( IF ( compressed_size = 0, 16384, compressed_size ))/ 1024 / 1024 ) AS 'Total Data(MB)' FROM information_schema.INNODB_BUFFER_PAGE JOIN information_schema.innodbtablespaces USING ( space ) WHERE NAME NOT LIKE 'innodb%' GROUP BY table_name,NAME ORDER BY 3 DESC LIMIT 10;
+----------------------------------+-------+----------------+
| table_name| pages | Total Data(MB) |
+----------------------------------+-------+----------------+
| NULL|36 |1 |
| mysql.columns|82 |1 |
| mysql.tables|35 |1 |
| mysql.schemata|3 |0 |
| mysql.tablespace_files|2 |0 |
| mysql.tablespaces|2 |0 |
| mysql.index_column_usage|13 |0 |
| mysql.table_partition_values |1 |0 |
| mysql.table_partitions|7 |0 |
| mysql.triggers|7 |0 |
+----------------------------------+-------+----------------+
10 rows in set (0.4951 sec)

3.我们用sysbench给数据库注入数据,并做数据库常规预热

[root@mysql8_3 ~]# sysbench --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-socket=/tmp/mysql.sock --mysql-db=test --range_size=100 --table_size=500000 --tables=6 --threads=2 --events=0 --time=60 --rand-type=uniform /usr/local/share/sysbench/oltp_read_only.lua prepare
sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)
Initializing worker threads...
Creating table 'sbtest1'...
Creating table 'sbtest2'...
Inserting 500000 records into 'sbtest1'
Inserting 500000 records into 'sbtest2'
Creating a secondary index on 'sbtest1'...
Creating a secondary index on 'sbtest2'...
Creating table 'sbtest3'...
Creating table 'sbtest4'...
Inserting 500000 records into 'sbtest3'
Inserting 500000 records into 'sbtest4'
Creating a secondary index on 'sbtest4'...
Creating a secondary index on 'sbtest3'...
Creating table 'sbtest6'...
Inserting 500000 records into 'sbtest6'
Creating table 'sbtest5'...
Inserting 500000 records into 'sbtest5'
Creating a secondary index on 'sbtest6'...
Creating a secondary index on 'sbtest5'...

[root@mysql8_3 ~]# sysbench --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-socket=/tmp/mysql.sock --mysql-db=test --range_size=100 --table_size=500000 --tables=6 --threads=2 --events=0 --time=20 --rand-type=uniform /usr/local/share/sysbench/oltp_read_only.lua run

sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)

Running the test with following options:

Number of threads: 2

Initializing random number generator from current time

Initializing worker threads...

Threads started!

SQL statistics:

queries performed:

read: 373660

write: 0

other: 53380

total: 427040

transactions: 26690 (1334.37 per sec.)

queries: 427040 (21350.00 per sec.)

ignored errors: 0 (0.00 per sec.)

reconnects: 0 (0.00 per sec.)

Throughput:

events/s (eps): 1334.3749

time elapsed: 20.0019s

total number of events: 26690

Latency (ms):

min: 1.23

avg: 1.50

max: 12.61

95th percentile: 1.82

sum: 39966.12

Threads fairness:

events (avg/stddev): 13345.0000/14.00

execution time (avg/stddev): 19.9831/0.00

4.我们看一下MySQL实例的缓存池数据

MySQL localhost SQL > SELECT table_name, COUNT(*) AS pages, round( sum( IF ( compressed_size = 0, 16384, compressed_size ))/ 1024 / 1024 ) AS 'Total Data(MB)' FROM information_schema.INNODB_BUFFER_PAGE JOIN information_schema.innodbtablespaces USING ( space ) WHERE NAME NOT LIKE 'innodb%' GROUP BY table_name, NAME ORDER BY 3 DESC LIMIT 10;
+-------------------+-------+----------------+
| table_name| pages | Total Data(MB) |
+-------------------+-------+----------------+
| test.sbtest5|7231 |113 |
| test.sbtest4|7236 |113 |
| test.sbtest2|7225 |113 |
| test.sbtest1|7222 |113 |
| test.sbtest3|7180 |112 |
| test.sbtest6|7195 |112 |
| NULL|36 |1 |
| mysql.columns |83 |1 |
| mysql.tables|35 |1 |
| mysql.servers |1 |0 |
+-------------------+-------+----------------+
10 rows in set (0.6053 sec)

5.然后确认这几个参数目前的值,当前为默认值

MySQL localhost SQL > show global variables like "%buffer_pool_dump%";
+-------------------------------------+-------+
| Variable_name| Value |
+-------------------------------------+-------+
| innodb_buffer_pool_dump_at_shutdown | OFF|
| innodb_buffer_pool_dump_now| OFF|
| innodb_buffer_pool_dump_pct| 25|
+-------------------------------------+-------+
3 rows in set (0.2649 sec)

6.现在我们重启数据库,查看缓冲池里数据,里面没有前面内存InnoDB缓冲池里的数据

MySQL localhost SQL > restart;
Query OK, 0 rows affected (0.0077 sec)
MySQL localhost SQL > \reconnect
Attempting to reconnect to 'mysql://root@/tmp%2Fmysql.sock'..
The global session was successfully reconnected.
MySQL localhost SQL > SELECT table_name, COUNT(*) AS pages, round( sum( IF ( compressed_size = 0, 16384, compressed_size ))/ 1024 / 1024 ) AS 'Total Data(MB)' FROM information_schema.INNODB_BUFFER_PAGE JOIN information_schema.innodbtablespaces USING ( space ) WHERE NAME NOT LIKE 'innodb%' GROUP BY table_name, NAME ORDER BY 3 DESC LIMIT 10;
+----------------------------------+-------+----------------+
| table_name| pages | Total Data(MB) |
+----------------------------------+-------+----------------+
| NULL|36 |1 |
| mysql.columns|80 |1 |
| mysql.tables|35 |1 |
| mysql.schemata|3 |0 |
| mysql.tablespace_files|2 |0 |
| mysql.tablespaces|2 |0 |
| mysql.index_column_usage|12 |0 |
| mysql.table_partition_values |1 |0 |
| mysql.table_partitions|7 |0 |
| mysql.triggers|7 |0 |
+----------------------------------+-------+----------------+
10 rows in set (0.5388 sec)

7.我们跑一下sysbench

[root@mysql8_3 ~]# sysbench --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-socket=/tmp/mysql.sock --mysql-db=test --range_size=100 --table_size=500000 --tables=6 --threads=2 --events=0 --time=20 --rand-type=uniform /usr/local/share/sysbench/oltp_read_only.lua run

sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)

Running the test with following options:

Number of threads: 2

Initializing random number generator from current time

Initializing worker threads...

Threads started!

SQL statistics:

queries performed:

read: 283822

write: 0

other: 40546

total: 324368

transactions: 20273 (1013.55 per sec.)

queries: 324368 (16216.82 per sec.)

ignored errors: 0 (0.00 per sec.)

reconnects: 0 (0.00 per sec.)

Throughput:

events/s (eps): 1013.5511

time elapsed: 20.0020s

total number of events: 20273

Latency (ms):

min: 1.22

avg: 1.97

max: 118.45

95th percentile: 4.03

sum: 39965.35

Threads fairness:

events (avg/stddev): 10136.5000/58.50

execution time (avg/stddev): 19.9827/0.00

8.然后我们启用InnoDB温启动参数

MySQL localhost SQL > set persist Innodb_buffer_pool_dump_at_shutdown=on;
Query OK, 0 rows affected (0.3886 sec)
MySQL localhost SQL > set persist Innodb_buffer_pool_dump_pct=100;
Query OK, 0 rows affected (0.0599 sec)
MySQL localhost SQL > show global variables like "%buffer_pool_dump%";
+-------------------------------------+-------+
| Variable_name| Value |
+-------------------------------------+-------+
| innodb_buffer_pool_dump_at_shutdown | ON|
| innodb_buffer_pool_dump_now| OFF|
| innodb_buffer_pool_dump_pct| 100|
+-------------------------------------+-------+

9.重启数据库查看缓冲池里数据,有数据没有表名,需要对表做一次访问,便会获取表名信息

MySQL localhost SQL > restart;
Query OK, 0 rows affected (0.0012 sec)
MySQL localhost SQL > \reconnect
Attempting to reconnect to 'mysql://root@/tmp%2Fmysql.sock'....
The global session was successfully reconnected.
MySQL localhost SQL > set global innodb_buffer_pool_load_now=on;
Query OK, 0 rows affected (0.2078 sec)

MySQL localhost SQL > SELECT table_name, COUNT(*) AS pages, round( sum( IF ( compressed_size = 0, 16384, compressed_size ))/ 1024 / 1024 ) AS 'Total Data(MB)' FROM information_schema.INNODB_BUFFER_PAGE JOIN information_schema.innodbtablespaces USING ( space ) WHERE NAME NOT LIKE 'innodb%' GROUP BY table_name, NAME ORDER BY 3 DESC LIMIT 10;
+-------------------+-------+----------------+
| table_name| pages | Total Data(MB) |
+-------------------+-------+----------------+
| NULL|6858 |107 |
| NULL|6859 |107 |
| NULL|6857 |107 |
| NULL|6859 |107 |
| NULL|6859 |107 |
| NULL|6858 |107 |
| NULL|39 |1 |
| mysql.columns |91 |1 |
| mysql.tables|41 |1 |
| mysql.servers |1 |0 |
+-------------------+-------+----------------+
10 rows in set (0.6161 sec)

10.然后再用sysbench跑一遍

[root@mysql8_3 ~]# sysbench --db-driver=mysql --mysql-user=root --mysql-password=123456 --mysql-socket=/tmp/mysql.sock --mysql-db=test --range_size=100 --table_size=500000 --tables=6 --threads=2 --events=0 --time=20 --rand-type=uniform /usr/local/share/sysbench/oltp_read_only.lua run

sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)

Running the test with following options:

Number of threads: 2

Initializing random number generator from current time

Initializing worker threads...

Threads started!

SQL statistics:

queries performed:

read: 378518

write: 0

other: 54074

total: 432592

transactions: 27037 (1351.73 per sec.)

queries: 432592 (21627.61 per sec.)

ignored errors: 0 (0.00 per sec.)

reconnects: 0 (0.00 per sec.)

Throughput:

events/s (eps): 1351.7255

time elapsed: 20.0018s

total number of events: 27037

Latency (ms):

min: 1.25

avg: 1.48

max: 9.38

95th percentile: 1.70

sum: 39964.79

Threads fairness:

events (avg/stddev): 13518.5000/70.50

execution time (avg/stddev): 19.9824/0.00

MySQL localhost test SQL > SELECT table_name, COUNT(*) AS pages, round( sum( IF ( compressed_size = 0, 16384, compressed_size ))/ 1024 / 1024 ) AS 'Total Data(MB)' FROM information_schema.INNODB_BUFFER_PAGE JOIN information_schema.innodbtablespaces USING ( space ) WHERE NAME NOT LIKE 'innodb%' GROUP BY table_name, NAME ORDER BY 3 DESC LIMIT 10;
+-------------------+-------+----------------+
| table_name| pages | Total Data(MB) |
+-------------------+-------+----------------+
| test.sbtest3|6858 |107 |
| test.sbtest5|6858 |107 |
| test.sbtest6|6858 |107 |
| test.sbtest4|6858 |107 |
| test.sbtest2|6858 |107 |
| test.sbtest1|6858 |107 |
| mysql.columns |99 |2 |
| NULL|36 |1 |
| mysql.tables|45 |1 |
| mysql.servers |1 |0 |
+-------------------+-------+----------------+
10 rows in set (0.5217 sec)

1.png

参考:

https://dev.mysql.com/doc/refman/8.4/en/innodb-architecture.html

https://dev.mysql.com/doc/refman/8.4/en/innodb-information-schema-buffer-pool-tables.html

https://dev.mysql.com/doc/refman/8.4/en/innodb-parameters.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
8
分享
相关文章
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
31 1
MySQL8.4 Enterprise安装Firewall及测试
MySQL8.4 Enterprise安装Firewall及测试
39 0
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
24 0
MySQL底层概述—10.InnoDB锁机制
本文介绍了:锁概述、锁分类、全局锁实战、表级锁(偏读)实战、行级锁升级表级锁实战、间隙锁实战、临键锁实战、幻读演示和解决、行级锁(偏写)优化建议、乐观锁实战、行锁原理分析、死锁与解决方案
180 24
MySQL底层概述—10.InnoDB锁机制
MySQL底层概述—5.InnoDB参数优化
本文介绍了MySQL数据库中与内存、日志和IO线程相关的参数优化,旨在提升数据库性能。主要内容包括: 1. 内存相关参数优化:缓冲池内存大小配置、配置多个Buffer Pool实例、Chunk大小配置、InnoDB缓存性能评估、Page管理相关参数、Change Buffer相关参数优化。 2. 日志相关参数优化:日志缓冲区配置、日志文件参数优化。 3. IO线程相关参数优化: 查询缓存参数、脏页刷盘参数、LRU链表参数、脏页刷盘相关参数。
143 12
MySQL底层概述—5.InnoDB参数优化
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
MySQL底层概述—4.InnoDB数据文件
本文介绍了InnoDB表空间文件结构及其组成部分,包括表空间、段、区、页和行。表空间是最高逻辑层,包含多个段;段由若干个区组成,每个区包含64个连续的页,页用于存储多条行记录。文章还详细解析了Page结构,分为通用部分(文件头与文件尾)、数据记录部分和页目录部分。此外,文中探讨了行记录格式,包括四种行格式(Redundant、Compact、Dynamic和Compressed),重点介绍了Compact行记录格式及其溢出机制。最后,文章解释了不同行格式的特点及应用场景,帮助理解InnoDB存储引擎的工作原理。
MySQL底层概述—4.InnoDB数据文件
MySQL底层概述—2.InnoDB磁盘结构
InnoDB磁盘结构主要包括表空间(Tablespaces)、数据字典(Data Dictionary)、双写缓冲区(Double Write Buffer)、重做日志(redo log)和撤销日志(undo log)。其中,表空间分为系统、独立、通用、Undo及临时表空间,分别用于存储不同类型的数据。数据字典从MySQL 8.0起不再依赖.frm文件,转而使用InnoDB引擎存储,支持事务原子性DDL操作。
298 100
MySQL底层概述—2.InnoDB磁盘结构
MySQL底层概述—1.InnoDB内存结构
本文介绍了InnoDB引擎的关键组件和机制,包括引擎架构、Buffer Pool、Page管理机制、Change Buffer、Log Buffer及Adaptive Hash Index。
328 97
MySQL底层概述—1.InnoDB内存结构
MySQL底层概述—3.InnoDB线程模型
InnoDB存储引擎采用多线程模型,包含多个后台线程以处理不同任务。主要线程包括:IO Thread负责读写数据页和日志;Purge Thread回收已提交事务的undo日志;Page Cleaner Thread刷新脏页并清理redo日志;Master Thread调度其他线程,定时刷新脏页、回收undo日志、写入redo日志和合并写缓冲。各线程协同工作,确保数据一致性和高效性能。
MySQL底层概述—3.InnoDB线程模型

数据库

+关注

相关产品

  • 云数据库 RDS MySQL 版
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等