Sysbench 是 MySQL 社交常用的压测工具,本文对 Sysbench 默认压测表大小进行分析,以帮助开发者了解该测试运行时的数据量大小。
结论概述
测试了 100万、500万数据,占用空间大小可以参考如下数据:
sysbench 表大小预估 | 单表记录 | 表数量 | 总空间预估 |
场景 1 | 1,000,000 | 10 | 2.3 GB |
场景 2 | 5,000,000 | 16 | 18.4 GB |
场景 3 | 10,000,000 | 16 | 36.32 GB |
生成数据命令
这里使用如下的命令进行数据生成
sysbench --mysql-host=... --mysql-db=sysbenchdb --db-driver=mysql \
--mysql-user=... --mysql-password=... \
--table_size=1000000 --tables=10 prepare
占用空间大小
可以通过如下命令观察数据库中的表大小:
MySQL [sysbenchdb]> show table status like '%sbtest1%'\G
*************************** 1. row ***************************
Name: sbtest1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 986400
Avg_row_length: 228
Data_length: 225132544
Max_data_length: 0
Index_length: 16269312
Data_free: 4194304
Auto_increment: 1000001
Create_time: 2025-03-01 05:57:45
Update_time: 2025-03-01 05:57:45
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
可以看到,单表约为 230 MB
:
(225132544+16269312)/1024/1024 ~ 230
再通过数据库的物理文件观察大小:
# ls -lah
total 2.4G
drwxr-x--- 2 mysql mysql 4.0K Mar 1 14:04 .
drwxr-x--x 11 mysql mysql 4.0K Mar 1 14:02 ..
-rw-r----- 1 mysql mysql 240M Mar 1 14:04 sbtest10.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:00 sbtest1.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:01 sbtest2.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:01 sbtest3.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:02 sbtest4.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:02 sbtest5.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:03 sbtest6.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:03 sbtest7.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:03 sbtest8.ibd
-rw-r----- 1 mysql mysql 240M Mar 1 14:04 sbtest9.ibd
可以看到,单表大小约为 240 MB,与上述计算的 230 MB 并无太大差距。
数据生成时间统计
这里使用的是一台 Amazon RDS xlarge 规格的实例,存储类型为io1
,iops规格为3000,在该环境下,大约18秒完成一个表的初始化,算是比较快的速度,即每秒写入约为5.5万记录。
关于“标准测试”
在“云数据库 MySQL 的对比测试”中,选择了4c16g的规格,压测时使用了10个记录数为100万的表,即按上述计算,数据量大小约为2.3GB。即,所有的数据均可以缓存再内存当中。这也是为什么该测试是一个 CPU 密集型测试的主要原因。
如果考虑将数据量调整为 500万,即单表约为1.15GB,总集16个表,那么数据量就可能达到 18.4 GB,那么这个测试就可能成为一个IO密集型的测试,准确的说,可能是一个读IO密集型的测试。
sysbench 表大小预估 | 单表记录 | 表数量 | 总空间预估 |
场景 1 | 1,000,000 | 10 | 2.3 GB |
场景 2 | 5,000,000 | 16 | 18.4 GB |
更多统计
Sysbench 500万数据大小
bash-5.1# ls -l
-rw-r----- 1 mysql mysql 1220542464 Mar 23 02:18 sbtest1.ibd
mysql> show table status\G
*************************** 1. row ***************************
Name: sbtest1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 4938540
Avg_row_length: 205
Data_length: 1017118720
Max_data_length: 0
Index_length: 0
Data_free: 3145728
Auto_increment: 5000001
Create_time: 2025-03-23 02:17:49
Update_time: 2025-03-23 02:17:49
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.01 sec)
可以看到,实际占用空间:1.137GB ~ 1220542464/1024/1024
。那么,依次数据,16个大小约为 18.19
GB。与上述数据并无太大差距。
Sysbench 1千万数据大小
如下数据统计了,1000万数据大小。可以看到,总占用磁盘空间:2.27GB = 2436890624/1024/1024/1024
。
bash-5.1# ls -l
-rw-r----- 1 mysql mysql 2436890624 Mar 23 02:42 sbtest1.ibd
mysql> show table status\G
*************************** 1. row ***************************
Name: sbtest1
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 9868349
Avg_row_length: 220
Data_length: 2179989504
Max_data_length: 0
Index_length: 0
Data_free: 5242880
Auto_increment: 10000001
Create_time: 2025-03-23 02:41:25
Update_time: 2025-03-23 02:41:25
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.01 sec)
mysql> select count(1) from sbtest1;
+----------+
| count(1) |
+----------+
| 10000000 |
+----------+
1 row in set (2.74 sec)
Leave a Reply