• 标题:DBaaS服务商Tessell获 $6000万融资; OceanBase开发者大会几乎5月于广州举行

    重要更新

    多云数据库平台服务商Tessell获 $6000万 容灾。此次融资将用于进一步扩大市场覆盖,并计划推出基于 AI 驱动的对话式数据库管理服务[1]

    2025 OceanBase开发者大会将于5月17日广州举行。本届大会以「当 SQL 遇见 AI」为主题,会上,OceanBase 还将重磅发布面向 AI 时代的一体化产品矩阵,并分享 TP、AP、KV 及 AI 能力的最新实践成果。[2]

    更新详情

    阿里云
    • PolarDB 库表恢复功能支持恢复速度配置,根据所占用的IOPS越多,实际恢复速度越快。[5]
    • PolarDB 账号管理新增全局只读账号[6]
    Azure(微软云)
    • 适用于基于 vCore 的 Azure Cosmos DB for MongoDB 的 Power BI 连接器发布(预览版)[8]
    • “I/O 性能分析”支持了Azure 虚拟机上的 SQL Server[11]
    GCP(谷歌云)
    • BigQuery 数据准备功能现已正式发布 (GA),它提供 Gemini 提供的 AI 驱动的数据清理、转换和数据扩充建议。支持使用 Dataform 进行可视化数据准备流程和流程调度。[14]
    • Cloud SQL 现已支持Enterprise Plus 推荐器。根据您的应用程序工作负载和资源利用率,推荐器可以识别升级到 Cloud SQL Enterprise Plus 版本后性能提升情况 [16]
    • BigQuery ML 现已支持以下生成式 AI 函数,可让您使用 Vertex AI Gemini 模型分析文本。[28]
    • BigQuery 迁移评估现已包含对 Amazon Redshift Serverless 的支持 [34]
    • 您现在可以集成 Cloud SQL for MySQL 和 Vertex AI,这允许您使用 Vertex AI 中托管的模型和生成向量嵌入[36]
    • Spanner 现在支持以下 GoogleSQL JSON mutator 函数 [65]
    • Spanner 向量索引和近似最近邻 (ANN) 距离函数(基于 GoogleSQL 方言)现已正式发布 [70]
    • 当您创建 Cloud SQL for SQL Server 实例时,版本SQL Server 2022 Standard 现在是默认版本[71]
    • Langchain 现已支持 Spanner ANN 索引[72]
    Oracle云
    • 性能中心中的 SQL 历史记录支持数据库的SQL执行查看 [73]
    火山云(字节)
    • 数据库传输服务 DTS 支持通过物理备份迁移的方式将本地数据迁移至云数据库 SQL Server 版。[76]
    • DTS 在订阅 MySQL 类型的数据到消息队列 Kafka 版或专有网络 Kafka 进行消费时,支持自定义表投递在 Kafka 中的 Topic。[77]
    百度云
    • PegaDB支持升级小版本[79]
    • PegaDB支持实例重启
    AWS(亚马逊云)
    • RDS for Oracle 支持 BYOL 的 m6id 和 r6id 实例类[80]
    • RDS 在数据库预览环境中支持 MariaDB 11.8[81]
    • Bedrock 知识库现在支持 Aurora PostgreSQL 和 MongoDB Atlas 矢量存储的混合搜索[82]
    • 宣布推出 Amazon ElastiCache for Memcached 的水平自动扩展功能[84]
    • Aurora PostgreSQL 支持 pgvector 0.8.0[90]
    • Amazon Neptune 宣布提供 99.99% 可用性服务等级协议[96]
    腾讯云
    • TDSQL-C MySQL 、云数据库 MySQL 针对数据库审计进行了如下优化。审计日志文件列表,增加生成进度展示。[108]
    • TDSQL-C MySQL 版发布可用区迁移功能,当集群的业务区域需要迁移时,通过可用区迁移可快速实现。[110]
    • TDSQL-C MySQL 版数据库审计支持日志投递至 Ckafka 消息队列,可采集实例的数据库审计日志[111]
    • 云数据库 SQL Server 监控功能更新:新增监控指标:“闩锁等待延迟”、“每秒锁超时次数”、磁盘队列长度等[113]

    参考链接

  • Sysbench QPS 详细数据

    dataaliyunawsazurebaidugooglehuaweioracletencent
    467491657141717761655275329876118
    8948333042820326028954989500411196
    161453363955418609452069263734319249
    322208212295964610483742715601788130337
    4827974162951251113599848219787758334849
    6433061177041513716364920921697762635951
    9635588208431866919334965922855825734147
    12838226223112096420061970422303804634271
    192401352253023274209601045623323780637142
    256401902236924643214121063823572785338175
    384419142209725153211041050623785800939298
    512415962179325700212791076823910838138840

    Latency (Event) 详细数据

    如下表格分别为:平均延迟 和 95%延迟数据。单位为:毫秒/ms。

    dataaliyunawsazurebaidugooglehuaweioracletencent
    410.6743.4450.8240.5443.5026.1524.1011.77
    815.1843.5751.0644.1749.7328.8628.7712.86
    1619.8245.0353.1547.2555.3231.0939.2214.96
    3226.0846.8559.7054.9477.5436.9273.0818.99
    4830.8853.0269.0563.53101.8443.66113.9324.79
    6434.8465.0676.1070.40125.0753.09151.0332.04
    9648.5582.9092.5489.37178.8875.60209.2550.60
    12860.27103.25109.87114.84237.39103.29286.2967.22
    19286.10153.37148.44164.86330.38148.15442.4993.04
    256114.65205.96186.90215.17433.06195.43586.49120.68
    384164.88312.70274.71327.48657.65290.43862.47175.84
    512221.51422.68358.43432.99855.41385.231098.68237.15
    dataaliyunawsazurebaidugooglehuaweioracletencent
    413.4646.6358.9256.8457.8731.3736.2413.46
    816.4146.6361.0861.0875.8234.9541.8515.00
    1620.0051.0264.4766.8490.7837.5669.2918.28
    3228.1653.8577.1980.03144.9744.98116.8025.28
    4862.1964.47104.8494.10189.9353.85176.7333.72
    64108.6878.60130.13102.97223.3470.55262.6445.79
    96155.8099.33167.44132.49277.21121.08325.98134.90
    128183.21132.49193.38170.48350.33144.97427.07150.29
    192227.40219.36240.02240.02475.79215.44623.33170.48
    256325.98287.38297.92303.33623.33308.841050.76196.89
    384411.96434.83458.96442.73926.33539.712539.17248.83
    512539.71569.67580.02580.021191.92559.502880.27320.17

    MySQL 参数对比表格

    dataaliyunawsazurebaidugooglehuaweioracletencent
    have_sslDISABLEDYESYESDISABLEDYESDISABLEDYESDISABLED
    innodb_buffer_pool_size9.75GB11GB24GB12GB11GB9GB17GB12GB
    innodb_doublewriteONOFFOFFONONONONON
    innodb_flush_log_at_trx_commit11111111
    innodb_flush_methodO_DIRECTO_DIRECTfsyncfsyncO_DIRECTO_DIRECTO_DIRECTO_DIRECT
    innodb_io_capacity200002002002000500012000125020000
    innodb_read_io_threads44NA84424
    innodb_write_io_threads44NA84444
    log_binONOFFONONONONONON
    performance_schemaOFFOFFONOFFONOFFONOFF
    rpl_semi_sync_master_enabledONNANAONNAONNAON
    rpl_semi_sync_master_timeout1000NANA10000NA10000NA10000
    sync_binlog11110001111
    thread_pool_size8NA8NANANA164
    version8.0.368.0.408.0.40-azure8.0.32-2.0.0.28.0.37-google8.0.28-2310038.0.40-u3-cloud8.0.30-txsql
    instance_typemysql.x4.large.2cdb.m6i.xlargeGP_Standard_D8ads_v54db-custom-4-16384rds.mysql.x1.xlarge.4.haMySQL.44c
    storage_typecloud_essdio1NAcloud_enhaNACLOUDSSDNAEXCLUSIVE
    storage_size100100100100100100100100
    storage_iopsNA30003000NANANANANA
    cpu_capacity172.3110.9139.873.846.4162.686.8128.5

  • 存储引擎在存储整数时,一般会使用最高位作为标志位,标记存储的整数是正数还是负数(参考),最高位也被称为“most significant bit (MSb)”。通常,最高位为1则表示正数,最高位为0,则表示负数。更进一步的,负数则会通过补码(参考:two’s complement)的方式表示。但是,InnoDB没有使用这种方法。

    InnoDB 的整数存储

    在死锁诊断时,偶然注意到,InnoDB 在存储整数时,与一般的系统是不同的。例如,int 类型存储 1 的时候,使用的表示是:0x80000001。更多的示例可以参考右图:

    整数值InnoDB 表示
    10x80000001
    -10x7fffffff
    70x80000007
    -70x7ffffff9

    可以看到,这与一般的有符号型的整数存储是相反的。即:

    • 正数表示时,最高位(MSb)为1
    • 负数表示时,最高位(MSb)为0

    关于这个问题,在 Stackoverflow上也有看到有部分用户有类似的疑问:

    本文将讨论为什么会这样。

    考虑 8-bit 场景下的

    这里来回顾一下“体系结构”中的最为基础的一些知识吧。

    整数值绝对值绝对值的二进制原码2-补码Offset binary(“移码”)
    110000-00010000-00010000-00011000-0001
    -110000-00011000-00011111-11110111-1111
    770000-01110000-01110000-01111000-0111
    -770000-01111000-01111111-100101111001

    说明:

    移码有两种计算方式,结果是等价的,即:

    • 直接将原始数据加上2(n-1),然后转化为二进制即可以
    • 将其补码,最高位进行一次翻转,即 “补码 XOR 2(n-1)

    验证存储方式

    为了确认 InnoDB 的整数处理,再MySQL 8.4.4的源码中找到如下 InnoDB 处理整型数据的代码:

      if (type == DATA_INT) {
        /* Store integer data in Innobase in a big-endian format,
        sign bit negated if the data is a signed integer. In MySQL,
        integers are stored in a little-endian format. */
    
        byte *p = buf + col_len;
    
        for (;;) {
          p--;
          *p = *mysql_data;
          if (p == buf) {
            break;
          }
          mysql_data++;
        }
    
        if (!(dtype->prtype & DATA_UNSIGNED)) {
          *buf ^= 128;
        }
    
        ptr = buf;
        buf += col_len;

    这段代码中,先将字节序做了颠倒(从最高字节位开始,逐个字节进行拷贝存储),即将 MySQL 层面的小端(little-endian)转化为了InnoDB层面的(big-endian)存储。而后,再对最高位进行了一次翻转,即这里的:*buf ^= 128操作。

    即:先将数据在MySQL层面的表示做了大小端的转化并拷贝过来,然后,将最高位进行翻转。即,先将2补码的表示模式拷贝过来,再将最高位进行翻转。

    什么要这么存储

    在 MySQL/InnoDB 官方文档或者代码中,并没有关于该实现的说明。不过这么做,有一个非常明显的好处,即所有的整数表示的大小关系,与实际存储的数据(当中无符号型对待)的大小关系是一致的。

    即,在上述的例子中:7 > 1 > -1 > -7,而对应的编码表示,也有对应的大小关系:

    0x80000007 > 0x80000001 >0x7fffffff > 0x7ffffff9

    这里对这个问题做一个简单探讨。先说结论吧,这是一种较为典型的整数编码方式:Offset binary(“移码”)。即,将需要表示的整数,加上一个数值,让所有的整数映射到自然数空间。例如,在MySQL中使用32位的int类型,需要表示的整数范围为[-231,231]。那么,实际表示时,则加上231。更为一般的,对于[-2(n-1), 2(n-1)]之间的所有整数在表示时,都加上了2(n-1)。即,建立的映射关系是:

    f(i) = i + 2(n-1)

    即对于任何要存储的整数i,实际存储时都存储上述的f(i)。而在实际运算时,则是,将补码的最高位进行一次翻转即可。

    关于补码

    例如,在 8 位二进制中,00000001 表示 +1,而 11111111 代表 -1。具体的,在表示-3 时,先取 3 的二进制 00000011,再逐位取反 11111100,最后加 1 得到 11111101,即 -3 的补码表示。这种方式让计算机能够高效地进行整数运算,是典型的正负数的方法,该方法的更多优势可以参考:two’s complement

    补充说明

    MySQL 层面的整数表示和 InnoDB 的整数存储是不同的。在“验证存储方式”小结中的代码中可以看到:

    • MySQL使用了小端(little-endian),InnoDB层面使用了大端(big-endian)存储
    • 在 MySQL 层面使用2-补码做有符号整数类型存储;而InnoDB层面使用了“移码”存储

    参考文档

  • InnoDB 的锁诊断是一个比较困难的事情。首先,锁机制是一种较为复杂的资源竞争管理机制,如果涉及的资源类型比较多,锁类型又比较多,那么锁机制就会看起来比较复杂。具体到,MySQL/InnoDB 上,确实也就非常复杂了。这里主要关注 InnoDB 层面的锁,涉及的内容则包括了记录锁(record)、间隙锁(gap)、索引缝隙锁(next-key),而为什么要加锁,则又涉及到隔离级别、MVCC的实现,而锁的实现,则又与 InnoDB 底层的数据存储结构有有一定的关系,总得来说涉及的面比较多,如果对于这些概念没有了解,则比较难理解 InnoDB 的锁机制,也就比较难去排查 InnoDB 锁出现的问题。

    另一个层面是排查手段。MySQL/InnoDB在早期的版本中,对于锁问题的排查手段是比较有限的,而且与很多的配置参数有关,所以了解这些参数,熟悉MySQL/InnoDB锁信息查看的一些方法,则是另一个需要了解的。

    所以,关于 InnoDB 锁问题的也并不是一两个话题能够说清楚的。本文可能是一个系列(给自己挖坑),一个自己学习以及锁问题排查经验的分享。

    构造主键锁竞争

    记录锁,应该是 InnoDB 锁类型中较为常见,也是在READ-COMMITTED事务级别下,比较容易遇到的死锁类型(如果有死锁的话)。这里通过观察主键死锁、唯一键死锁,初步了解 InnoDB 锁信息内容,以及结构。

    查看当前的隔离级别

    mysql> show global variables like '%iso%';
    +-----------------------+----------------+
    | Variable_name         | Value          |
    +-----------------------+----------------+
    | transaction_isolation | READ-COMMITTED |
    +-----------------------+----------------+
    1 row in set (0.01 sec)
    
    mysql> show session variables like '%iso%';
    +-----------------------+----------------+
    | Variable_name         | Value          |
    +-----------------------+----------------+
    | transaction_isolation | READ-COMMITTED |
    +-----------------------+----------------+
    1 row in set (0.00 sec)

    准备表结构

    DROP TABLE IF EXISTS t1;
    
    CREATE TABLE t1 ( 
      id int unsigned, 
      nick varchar(32),
      age int,
      primary key (id)
    )
    mysql> desc t1;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id    | int unsigned | NO   | PRI | NULL    |       |
    | nick  | varchar(32)  | YES  |     | NULL    |       |
    | age   | int          | YES  |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+

    构建锁等待

    在两个会话中,按从上到下,执行下述的SQL:

    时间顺序Session ASession B
    1START TRANSACTION;
    2INSERT INTO t1 VALUES ( 1, "a",12 );
    3START TRANSACTION;
    4INSERT INTO t1 VALUES ( 1, "x",23 );

    这时候,Session B会陷入等待。

    观察锁信息

    通过 SHOW INNODB STATUS 观察

    此时查看 InnoDB 锁信息,则有如下数据:

    ---TRANSACTION 10094, ACTIVE 14 sec inserting
    mysql tables in use 1, locked 1
    LOCK WAIT 2 lock struct(s), heap size 1128, 1 row lock(s)
    MySQL thread id 84, OS thread handle 140453961758272, query id 9262 10.88.0.1 sysb update
    INSERT INTO t1 VALUES ( 1, "x",23 )
    ------- TRX HAS BEEN WAITING 14 SEC FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 27 page no 4 n bits 72 index PRIMARY of table `sysbenchdb`.`t1` trx id 10094 lock mode S locks rec but not gap waiting
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
     0: len 4; hex 00000001; asc     ;;
     1: len 6; hex 00000000276d; asc     'm;;
     2: len 7; hex 810000008d0110; asc        ;;
     3: len 1; hex 61; asc a;;
     4: len 4; hex 8000000c; asc     ;;
    
    ------------------
    ---TRANSACTION 10093, ACTIVE 23 sec
    2 lock struct(s), heap size 1128, 1 row lock(s), undo log entries 1
    MySQL thread id 83, OS thread handle 140454159017536, query id 9260 10.88.0.1 sysb

    SHOW ENGINE INNODB STATUS\G中仅打印了处于等待授予状态的锁信息,即这里仅打印了事务10094的等待的锁详情。

    详解锁信息

    这里详细看看其中的内容:

    RECORD LOCKS space id 27 page no 4 n bits 72 index PRIMARY of table `sysbenchdb`.`t1` trx id 10094 lock mode S locks rec but not gap waiting
    “RECORD LOCKS”这是一个记录锁
    space id 27 page no 4该记录处于物理位置,包括页面编号,以及页面所处的物理文件编号
    n bits 72该页面有72个记录对应标记位
    index PRIMARY of table sysbenchdb.t1 对应表
    trx id 10094所在的事务 ID
    lock mode S锁类型,为 S ,即共享锁
    locks rec but not gap这是一个简单记录锁,无需对记录前的“间隙”加锁
    Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
     0: len 4; hex 00000001; asc     ;;
     1: len 6; hex 00000000276d; asc     'm;;
     2: len 7; hex 810000008d0110; asc        ;;
     3: len 1; hex 61; asc a;;
     4: len 4; hex 8000000c; asc     ;;
    Record lock(等待的)记录锁
    heap no 2在页面中,记录以堆的方式存放,该记录的堆编号
    PHYSICAL RECORD: n_fields 5;记录共五个字段
    0: len 4; hex 00000001; asc ;;id 字段值,为1
    1: len 6; hex 00000000276d; asc 'm;;该记录的DB_TRX_ID,即为0x276d10093
    2: len 7; hex 810000008d0110; asc ;;DB_ROLL_PTR
    3: len 1; hex 61; asc a;;字段nick取值 a
    4: len 4; hex 8000000c; asc ;;字段age取值 0x8000000c,即12

    这里需要注意的是,这里一共有五个字段(n_fields 5; )。那实际这个表,只有三个字段,为什么这里会有五个字段?原因在于,InnoDB 在存储数据信息的时候,会额外的存储两个信息:DB_TRX_IDDB_ROLL_PTR。这是两个InnoDB的较为底层的概念,具体的可以参考该文档:17.3 InnoDB Multi-Versioning

    注意到,这里的 DB_TRX_ID 取值为 0x276d,转化为10进制则为:10093。即,该条记录最后一次被修改是被事务10093所修改,即上述表格中的Session A所执行的SQL所修改。

    在内置视图中查看锁信息

    mysql> SELECT
        ->     ENGINE_TRANSACTION_ID AS TRX_ID,
        ->     OBJECT_NAME,
        ->     INDEX_NAME,
        ->     LOCK_TYPE,
        ->     LOCK_MODE,
        ->     LOCK_STATUS,
        ->     LOCK_DATA
        ->   FROM performance_schema.data_locks;
    +--------+-------------+------------+-----------+---------------+-------------+-----------+
    | TRX_ID | OBJECT_NAME | INDEX_NAME | LOCK_TYPE | LOCK_MODE     | LOCK_STATUS | LOCK_DATA |
    +--------+-------------+------------+-----------+---------------+-------------+-----------+
    |  10224 | t1          | NULL       | TABLE     | IX            | GRANTED     | NULL      |
    |  10225 | t1          | NULL       | TABLE     | IX            | GRANTED     | NULL      |
    |  10224 | t1          | PRIMARY    | RECORD    | X,REC_NOT_GAP | GRANTED     | 1         |
    |  10225 | t1          | PRIMARY    | RECORD    | S,REC_NOT_GAP | WAITING     | 1         |
    +--------+-------------+------------+-----------+---------------+-------------+-----------+

    (注:这里的TRX_ID与上述不同,因为这是重新执行了上述的冲突事务)

    补充说明

    在本示例中,写入的数据仅为主键(也是一种唯一键),故无论是READ-COMMITTED、还是REPEATABLE-READ,其所需要的锁都相同的。

    相关参考资源

    1. InnoDB Locking and Transaction Model@MySQL 8.4 Reference Manual
    2. InnoDB Data Locking – Part 1 “Introduction”@MySQL Blog Archive
    3. InnoDB Data Locking – Part 2 “Locks”@MySQL Blog Archive
    4. InnoDB Data Locking – Part 2.5 “Locks” (Deeper dive)@MySQL Blog Archive
    5. InnoDB Data Locking – Part 3 “Deadlocks”@MySQL Blog Archive
    6. Understanding InnoDB Locks and Deadlocks@2015 Percona Live
    7. Introduction to Transaction Locks in InnoDB Storage Engine@2013
  • 标题: OceanBase 单机版邀测发布,资源要求2c6g;腾讯云发布双节点经济型规格; Amazon RDS支持 MySQL 9.2

    重要更新

    3月27日,OceanBase 合作伙伴大会在北京举行,单机版发布并开启邀测[1]

    更新详情

    阿里云
    • RDS SQL Server支持自定义慢日志阈值。具体的,可在参数管理页面通过设置rds_slow_log_threshold灵活调整SQL慢日志采集阈值,精准捕捉性能瓶颈相关的SQL语句,从而快速定位问题根源。[4]
    Azure(微软云)
    • Azure Database for PostgreSQL 的长期备份保留、按需备份正式 GA [5][6]
    • Azure Cosmos DB 中多区域写入帐户的时间点还原功能公测发布 [7]
    • 适用于 Azure Functions 的 Azure Database for MySQL 触发器公测发布 [8]
    GCP(谷歌云)
    火山云(字节)
    • veDB MySQL 支持参数模板的方式批量进行参数管理 [28]
    • veDB MySQL 部分参数支持与参数规格进行联动配置 [30]
    • veDB MySQL 新创建实例的默认读写终端,以及用户新建的自定义读写终端,其一致性级别的默认值将由会话一致性调整为最终一致性 [31]
    • 托管 SQL Server 支持获取连接云数据库 SQL Server 版实例的客户端 IP。[34]
    • 托管 SQL Server 物理备份方式中全量备份的基础上增加了差异备份。[37]
    • 托管 MongoDB 副本集实例,以及分片集群实例中 新增支持 oplogMinRetentionHours 参数管理 [39]
    • 托管 MongoDB 优化了 transactionLifetimeLimitSeconds 参数,将参数取值范围上限调整为 200 [40]
    AWS(亚马逊云)
    • RDS 在数据库预览环境中支持 MySQL 9.2 [42]
    • RDS for SQL Server 支持链接到 Teradata 数据库的服务器 [48]
    腾讯云
    • 云数据库 MySQL 5.7内核版本更新20250330。[58]
    • 云数据库 MySQL 全新支持双节点经济型实例。新架构提供稳定服务,满足业务所需的计算和存储需求的同时降低了使用成本,为中小型企业、个人开发者提供更加适配业务需求的数据库服务。[59]
    • 云数据库 MySQL 只读分析引擎发布了全新的问题修复版本1.2404.22.1与2.2410.4.1。[60]
    • TDSQL-C MySQL 版只读分析引擎发布了全新的问题修复版本1.2404.22.1与2.2410.4.1。[61]
    • TDSQL-C MySQL 版8.0内核版本更新3.1.15.006,提升数据库性能与稳定性。[62]

    参考链接

  • 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)