我想测试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;
答案 0 :(得分:0)
(从MySQL的角度看...)
id
和PK-每行节省8个字节。UNIQUE(user_id)
升级为PRIMARY KEY(user_id)
-每行可能节省40个字节(取决于LENGTH(user_id)
)。要做那些事
运行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
行“随机”快 。 (如果数据已经排序,那么这种多余的排序将被浪费。)