2

我想测试 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;
4

1 回答 1

0

(从 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 列压缩为 aBLOB总共可能会缩小到 400 字节/行,因此 250M 行只有 100GB。

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

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

于 2019-07-05T16:04:51.253 回答