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

简介: 使用温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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
149 15
|
8月前
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
273 1
|
12月前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
1993 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
8月前
|
SQL 缓存 关系型数据库
MySQL8.4 Enterprise安装Firewall及测试
MySQL8.4 Enterprise安装Firewall及测试
264 0
|
8月前
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
156 0
|
9月前
|
Oracle 关系型数据库 MySQL
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
|
12月前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
525 7
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
380 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
611 7
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
223 9

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多