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

时间:2019-07-02 19:38:42

标签: mysql mariadb benchmarking sysbench

我想测试InnoDB和MySQL数据库的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;

1 个答案:

答案 0 :(得分:0)

(从MySQL的角度看...)

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

要做那些事

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

运行OS监视工具,以查看消耗了I / O的百分比。 可能是限制因素。

基准测试产品在某些情况下很方便。对于您的情况(以及许多其他情况),最好构建产品并进行计时。

另一个想法...

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

如果JSON更复杂,则可以通过拔出始终存在的“列”来节省费用。

如果JSON为“大”,则在客户端将其压缩,然后写入BLOB。这样可使磁盘占用空间和网络带宽减少3倍。

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

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

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