使用mysqlslap测试插入查询

时间:2019-02-14 15:59:26

标签: mysql query-performance

首先,我是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;

请帮助我

1 个答案:

答案 0 :(得分:2)

基准测试INSERTs存在几个问题。速度会随着您插入的越来越多而改变,但不会以容易预测的方式发生。

插入(大致)以这种方式执行

  1. 检查重复的密钥。您有两个唯一键(PK和UNIQUE)。每个BTree都会被向下钻取以检查是否有重复。假设没有重复...
  2. 该行将插入到数据中(由PK锁定的BTree)
  3. “行”将插入到每个唯一的BTree中。在您的情况下,有一个BTree有效地由(column1,column2)排序并包含(id)。
  4. 将每个非唯一索引的内容放入“更改缓冲区”。

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

更改缓冲区实际上是对非唯一索引的“延迟写入”。这种延迟必须最终解决。也就是说,在某些时候,如果后台进程无法跟上这些更改,事情将会变慢。也就是说,如果您插入100万行,则可能不会达到此速度;如果您插入1000万行,则可以点击它。

另一个变量:VARCHAR(2048)(以及其他TEXTBLOB列)可能可能“不在记录中” ”。这取决于行的大小,该列的大小和“行格式”。大字符串可能会占用更多磁盘空间,从而降低基准测试速度,可能会显着降低。也就是说,如果仅使用小字符串和某些行格式进行基准测试,则插入时间将比其他情况更快。

您需要了解基准程序的运行方式-以及应用程序的运行方式:

  • 在单个线程中一次插入一行-每行都是一个事务。
  • 在单个线程中一次插入一行-批量处理成一个事务。
  • 在单个事务中的单个线程中一次插入100行。
  • 加载数据。
  • 以上各者均具有多个线程。
  • 不同的事务隔离设置。
  • 等等。

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

为每秒插入5万行的数据设计表/插入

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

评论后

好吧,更像是3TB,然后再扔数据并重新开始(在2小时内)?为此,我建议PARTITION BY RANGE并使用一些时间函数,在每个分区中给您5分钟。这将为您提供合理数量的分区(大约25个),而DROP PARTITION仅将丢失约100GB,这可能不会使文件系统不堪重负。更多讨论:http://mysql.rjweb.org/doc.php/partitionmaint

至于字符串...您建议使用25KB,但声明中并没有那么多?