首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mysqlslap测试插入查询

使用mysqlslap测试插入查询
EN

Stack Overflow用户
提问于 2019-02-14 23:59:26
回答 1查看 414关注 0票数 1

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

那么,如何使用mysqlslap并发地对这个表进行性能测试呢?

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

下面是我的表格的框架:

代码语言:javascript
复制
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;

在这方面请帮帮我

EN

回答 1

Stack Overflow用户

发布于 2019-02-16 09:27:28

INSERTs进行基准测试有几个问题。随着您插入的内容越来越多,速度会发生变化,但不是以一种容易预测的方式。

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

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

如果你有AUTO_INCREMENT或者UUID或者...,会有更多的讨论。

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

另一个变量:VARCHAR(2048) (以及其他TEXTBLOB列)可以存储在“非记录”中,也可以不存储。这取决于行的大小、列的大小和“行格式”。较大的字符串可能会受到额外的磁盘命中,从而减慢基准测试,可能会减慢很明显的量。也就是说,如果您只使用较小的字符串和某些行格式进行基准测试,则插入时间会比其他情况下更快。

您需要了解基准程序是如何运行的--以及您的应用程序将如何运行:

事务隔离在单个线程中一次插入一行--在单个线程中每次插入一个事务行--使用每个above.

  • Different事务隔离settings.

  • Etc.

,在单个transaction.

  • LOAD DATA.

  • Multiple线程中的单个线程中,每次将100行批处理到一个事务中

(我不喜欢基准测试,因为它们有太多缺陷。)比较硬件或有限的模式/应用程序更改的“最佳”基准测试:从正在运行的应用程序捕获“一般日志”;在开始时捕获数据库;对重新应用该日志进行计时。

为50K插入行/秒设计表/插入

  • 最小化索引。在您的情况下,您所需要的就是PRIMARY KEY(col1, col2);丢弃其余部分;丢弃id。请解释一下col1和col2是什么;这里可能有更多的提示。
  • 把桌子移开。严肃地说,考虑每秒汇总50K行,并且只存储汇总。如果它是实用的,这将大大加快速度。
  • 以某种方式批量插入行。这里的细节取决于您是否有一个或多个客户端执行插入,您是否需要在数据到来时对其进行处理,等等。更多讨论:http://mysql.rjweb.org/doc.php/staging_table
  • What在这些字符串中?他们可以/应该是'normalized'?
  • Let's讨论数学。您每年会加载大约10 per的数据吗?你有那么大的磁盘空间吗?您将如何处理这些数据?读取即使是一小部分数据也需要多长时间?或者这将是一个“只写”的database??
  • More数学。50K行* 0.5KB =每秒25MB写入磁盘。你有什么设备?它能处理,比方说,2倍吗?(对于您的原始模式,由于所有索引,它更像是60MB/s。)

注释后的

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54694433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档