MySQL 压测工具 Sysbench 生产数据大小预估

Sysbench 是 MySQL 社交常用的压测工具,本文对 Sysbench 默认压测表大小进行分析,以帮助开发者了解该测试运行时的数据量大小。

结论概述

测试了 100万、500万数据,占用空间大小可以参考如下数据:

sysbench 表大小预估单表记录表数量总空间预估
场景 11,000,000102.3 GB
场景 25,000,0001618.4 GB
场景 310,000,0001636.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 表大小预估单表记录表数量总空间预估
场景 11,000,000102.3 GB
场景 25,000,0001618.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

Your email address will not be published. Required fields are marked *