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 数据集。

由于生成这些 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 | customer | lineitem | nation | orders | part | partsupp | region | supplier | 总时间 |
10.7 | 0m1.076s | 1m55.075s | 0m0.006s | 0m16.041s | 0m1.271s | 0m6.647s | 0m0.010s | 0m0.238s | 140.364s |
10.7-mdev-24621-innodb-bulk-insert | 0m4.175s | 1m47.870s | 0m0.006s | 0m13.670s | 0m1.191s | 0m7.718s | 0m0.006s | 0m0.261s | 134.897s |
如何亲自尝试 10.7 InnoDB 批量插入预览特性?
有两种方式可以预览此特性
Tarball
前往 tarball 下载页面
容器
您可以运行名为 quay.io/mariadb-foundation/mariadb-devel:10.7-mdev-24621-innodb-bulk-insert 的容器,如我在上面所做的那样。
欢迎提供反馈
如果您在此特性预览版中遇到任何问题,无论是在设计上,还是特别是性能下降的情况,请在 MDEV 项目中通过提交 JIRA 错误/特性请求告诉我们。欢迎您在 Zulip 上讨论。