使用mysqlslap测试插入查询

问题描述 投票:0回答:1

首先,我是mysqlslap的新手我想在现有数据库上使用mysqlslap测试插入查询。我要测试的表具有主要和复合唯一性。

那么,如何同时使用mysqlslap对此表进行性能测试?

我不应该面对mysql错误重复键

下面是我桌子的骨架:

CREATE TABLE data (
  id bigint(20) NOT NULL,
  column1 bigint(20) DEFAULT NULL,
  column2 varchar(255) NOT NULL DEFAULT '0',
  datacolumn1 VARCHAR(255) NOT NULL DEFAULT '',
  datacolumn2 VARCHAR(2048) NOT NULL DEFAULT '',
  PRIMARY KEY (id),
  UNIQUE KEY profiles_UNIQUE (column1,column2),
  INDEX id_idx (id),
  INDEX unq_id_idx (column1, column2) USING BTREE
) ENGINE=innodb DEFAULT CHARSET=latin1;

请帮帮我

mysql query-performance
1个回答
2
投票

基准测试INSERTs有几个问题。当您插入越来越多时,速度会发生变化,但不会以容易预测的方式变化。

Insert(大致)以这种方式执行:

  1. 检查重复密钥。您有两个唯一键(PK和UNIQUE)。每个BTree将被钻取以检查重复。假设没有重复......
  2. 该行将插入数据中(由PK键控的BTree)
  3. 将在每个唯一B树中插入“行”。在您的情况下,有一个BTree有效地排序(第1列,第2列)并包含(id)。
  4. 将东西放入每个非唯一索引的“更改缓冲区”中。

如果你有AUTO_INCREMENTUUID或......,会有更多的讨论。

更改缓冲区实际上是对非唯一索引的“延迟写入”。这种延迟最终必须得到处理。也就是说,在某个时候,如果后台进程无法跟上变化,事情就会变慢。也就是说,如果你插入100万行,你可能不会遇到这种减速;如果您插入1000万行,您可能会点击它。

另一个变量:VARCHAR(2048)(以及其他TEXTBLOB列)可能会或可能不会存储“不记录”。这取决于行的大小,该列的大小和“行格式”。一个大的字符串可能需要额外的磁盘命中,从而减慢基准,可能是一个显着的数量。也就是说,如果仅使用小字符串和某些行格式进行基准测试,则插入时间会比其他方式更快。

您需要了解基准程序的运行方式 - 与应用程序的运行方式相比:

  • 在一个线程中一次插入一行 - 每个都是一个事务。
  • 在一个线程中一次插入一行 - 批量处理到事务中。
  • 在单个事务中的单个线程中一次插入100行。
  • 负载数据。
  • 多个线程与上面的每一个。
  • 不同的事务隔离设置。
  • 等等。

(由于他们有多少缺陷,我不喜欢基准测试。)用于比较硬件或有限模式/应用程序更改的“最佳”基准:从正在运行的应用程序中捕获“常规日志”;在开始时捕获数据库;重新申请该日志的时间。

设计一个50K插入行/秒的表/插入

  • 最小化索引。在你的情况下,你需要的只是PRIMARY KEY(col1, col2);折腾剩下的;扔id。请解释col1和col2是什么;这里可能还有更多提示。
  • 摆脱桌子。说真的,考虑每秒汇总50K行并仅存储汇总。如果它是实用的,这将大大加快速度。或者也许一分钟的价值。
  • 以某种方式批量插入行。这里的详细信息取决于您是否有一个或多个客户端进行插入,是否需要按原样对数据进行按摩等。更多讨论:http://mysql.rjweb.org/doc.php/staging_table
  • 这些字符串是什么?可以/应该“正常化”吗?
  • 我们来讨论数学。你每年要加载大约10 PB吗?你有那么多的磁盘空间吗?您将如何处理数据?阅读甚至一小部分数据需要多长时间?或者它是一个“只写”数据库?
  • 更多数学。 50K行* 0.5KB = 25MB每秒写入磁盘。你有什么设备?它能处理2倍吗? (使用原始模式,由于所有索引,它将更像是60MB / s。)

评论后

好的,所以在你丢弃数据并重新开始(2小时)之前更像3TB?为此,我建议使用PARTITION BY RANGE并使用一些时间函数,在每个分区中给你5分钟。这将为您提供合理数量的分区(大约25个),DROP PARTITION将仅下降大约100GB,这可能不会压倒文件系统。更多讨论:http://mysql.rjweb.org/doc.php/partitionmaint

至于字符串...你建议25KB,但声明不允许那么多???

© www.soinside.com 2019 - 2024. All rights reserved.