gpt4 book ai didi

mysql - 在同一个表中的多个线程上批量插入 MySQL 基准

转载 作者:行者123 更新时间:2023-11-29 03:15:52 28 4
gpt4 key购买 nike

我想测试MySQL数据库的InnoDB和MyRock引擎之间的高强度写入。为此,我使用 sysbench 进行基准测试。我的要求是:

  • 多线程并发写入同一张表。
  • 支持批量插入(每次插入事务都会插入大量记录)

我检查了 sysbench 的所有预制测试,但没有看到任何满足我要求的测试。

  • oltp_write_only:支持多线程写入同一个表。但是这个测试没有批量插入选项。
  • bulk_insert:支持多线程,但每个线程写入不同的表。

是否有任何预制的 sysbench 测试满足我的要求?如果没有,我可以在某个地方找到已经完成此操作的自定义 Lua 脚本吗?

(来自评论:)

CREATE TABLE IF NOT EXISTS `tableA` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR(63) NOT NULL DEFAULT '',
`data` JSON NOT NULL DEFAULT '{}',
PRIMARY KEY (`id`),
UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC)
) ENGINE = InnoDB;

最佳答案

(从MySQL的角度...)

  • 抛出 id 和 PK -- 每行节省 8 个字节。
  • UNIQUE(user_id) 提升为 PRIMARY KEY(user_id) -- 每行可能节省 40 个字节(取决于 LENGTH(user_id) ).

做那些会

  • 减少所需的磁盘 I/O(提供一些加速)
  • 消除其中一个索引(可能是加载后处理的重要部分)

运行操作系统监控工具以查看正在消耗的 I/O 百分比。 可能是限制因素。

基准测试产品在有限的情况下很方便。对于您的情况(以及许多其他情况),最好构建您的产品并安排时间。

另一个想法...

JSON 是什么样子的?如果 JSON 具有简单的结构(一组一致的键:值对),那么如果您制作单独的列,磁盘占用空间可能会减少一半(因此速度加倍)。从 JSON 更改为单个列的处理将在客户端完成,这可能(也可能不会)抵消我预测的节省。

如果 JSON 更复杂,通过拉出始终存在的“列”可能仍然可以节省成本。

如果 JSON“大”,则在客户端压缩它,然后写入 BLOB。这可能会将磁盘占用空间和网络带宽缩小 3 倍。

您提到 250GB 用于 250M 行?那是 1000 字节/行。这意味着 JSON 平均为 700 字节? (注意:存在开销。)将 JSON 列压缩到 BLOB 中会缩小到总共 400 字节/行,因此 250M 行只有 100GB。

{"b": 100} 大约需要 10 个字节。如果 b 可以存储在 2 字节的 SMALLINT 列中,那将大大缩小记录。

另一件事:如果将 user_id 提升为 PK,则值得考虑:在加载表之前使用文件排序按 user_id 对表进行排序。这可能比“随机”插入行快。 (如果数据已经排序,那么这额外的排序将被浪费。)

关于mysql - 在同一个表中的多个线程上批量插入 MySQL 基准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56859033/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com