10.7 预览特性:InnoDB 批量插入

所有人都想要性能。加速向空的 InnoDB 表和分区中插入数据是一个常见的用例,值得进行优化。MariaDB 公司的 Thirunarayanan Balathandayuthapani 编写了这一改进,用于 InnoDB 表的批量插入,该改进已作为预览版供测试。

为了实现这一点,如果表是空的,则 InnoDB 将预先为每个索引对记录进行排序,然后逐页构建索引。如果事务执行批量插入操作,则 InnoDB 应为每个索引创建大小为 innodb_sort_buffer_size 的缓冲区。

如果缓冲区内存不足,则 InnoDB 将创建一个临时文件来存储数据。一旦事务语句提交,则 InnoDB 应排序缓冲区/文件块,并为每个索引执行批量插入操作。

对于外部存储字段,InnoDB 批量插入操作会将数据存储在临时创建的 blob 文件中。将字段数据存储在 blob 文件中的标准是大小超过 2000 字节。

当前的限制是批量插入仅支持单个大型 INSERT … VALUES SQL 或 LOAD DATA SQL。
为了提高加载性能,现有的机制是禁用 foreign_key_checks=0 和 unique_checks=0(在 10.6+ 版本中,由于 MDEV-515)。

性能示例

在下面的示例中,使用了 HammerDB 来生成一个规模为 1 的 TPROCH 数据集。

使用 HammerDB Datagen 创建 tbl 文件

由于生成这些 tbl 文件时每个虚拟用户对应一个文件,所以将它们连接起来,以便与 LOAD DATA INFILE 一起使用。

这些表的模式是使用 mariadb-dump –no-data tproch 从另一个实例创建的。

这些测试是在一台配备 8 核 CPU、16G 内存的普通笔记本电脑上进行的,CPU 调控器设置为性能模式。为了避免加密存储的性能影响,我将 innodb_flush_log_at_trx_commit=0 作为一种缓解措施。

在这里,我将使用此预览版本与 10.7 基线开发版本进行了比较。

$ podman run --rm --detach \
 --env MARIADB_RANDOM_ROOT_PASSWORD=1 \
 --env MARIADB_DATABASE=tproch \
 --env MARIADB_USER=tproch \
 --env MARIADB_PASSWORD=tproch \
 --name mdb107_base \
 -P \
 -v ./:/docker-entrypoint-initdb.d:z \
 quay.io/mariadb-foundation/mariadb-devel:10.7 \
--innodb-buffer-pool-size=6G \
--innodb-log-file-size=4G \
--innodb_flush_log_at_trx_commit=0

docker-entrypoint-initdb.d 包含 tables.sql 文件,用于在启动时创建表。

$ podman port mdb107_base 3306
0.0.0.0:35545

使用上面的端口号,以下命令被用于并行加载表数据

$  for t in customer lineitem nation orders part partsupp region supplier; do 
  tbl=${t^^*};
  echo table=$tbl
  time mariadb -h 127.0.0.1 --port 35545  -u tproch -ptproch \
    --local-infile=1 \
    -e "set @@foreign_key_checks=0;
    load data local infile '$t.tbl' into table $tbl FIELDS terminated by '|';" tproch
 done

下表显示了每个表的计时结果

容器标签
quay.io/mariadb-foundation/mariadb-devel
customerlineitemnationorderspartpartsuppregionsupplier总时间
10.70m1.076s1m55.075s0m0.006s0m16.041s0m1.271s0m6.647s0m0.010s0m0.238s140.364s
10.7-mdev-24621-innodb-bulk-insert0m4.175s1m47.870s0m0.006s0m13.670s0m1.191s0m7.718s0m0.006s0m0.261s134.897s
加载每个表的实际计时测量结果

如何亲自尝试 10.7 InnoDB 批量插入预览特性?

有两种方式可以预览此特性

Tarball

前往 tarball 下载页面

容器

您可以运行名为 quay.io/mariadb-foundation/mariadb-devel:10.7-mdev-24621-innodb-bulk-insert 的容器,如我在上面所做的那样。

欢迎提供反馈

如果您在此特性预览版中遇到任何问题,无论是在设计上,还是特别是性能下降的情况,请在 MDEV 项目中通过提交 JIRA 错误/特性请求告诉我们。欢迎您在 Zulip 上讨论。