代码之家  ›  专栏  ›  技术社区  ›  Raashith

使用mysqlslap测试插入查询

  •  0
  • Raashith  · 技术社区  · 7 年前

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

    请帮帮我

    0 回复  |  直到 7 年前
        1
  •  3
  •   Rick James diyism    7 年前

    标杆管理有几个问题 INSERTs . 随着插入的次数越来越多,速度也会发生变化,但不是以一种容易预测的方式。

    插入的执行方式(大致)如下:

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

    如果你有 AUTO_INCREMENT 或a UUID 或会有更多的讨论。

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

    另一个变量: VARCHAR(2048) (和其他 TEXT BLOB 列) 也许 可能不会 存储为“非记录”。这取决于行的大小、列的大小和“行格式”。一根大绳子 也许 额外的磁盘命中,从而降低基准测试的速度,可能会显著降低。也就是说,如果只使用小字符串和某些行格式进行基准测试,则插入时间会更快。

    您需要了解基准测试程序的运行方式,而不是应用程序的运行方式:

    • 在单个线程中一次插入一行,每一行都是一个事务。
    • 在单个线程中一次插入一行,即批处理到事务中的批。
    • 在单个事务的单个线程中一次插入100行。
    • 加载数据。
    • 以上各有多个线程。
    • 不同的事务隔离设置。

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

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

    • 最小化索引。就你而言,你只需要 PRIMARY KEY(col1, col2) ; 把剩下的扔掉;扔 id . 请解释什么是col1和col2;这里可能有更多提示。
    • 把桌子扔了。认真地说,请考虑每秒汇总50K行,并只存储摘要。如果可行,这将大大加快速度。或者一分钟的价值。
    • 以某种方式批量插入行。此处的详细信息取决于是否有一个或多个客户端执行插入,是否需要在数据到达时对其进行按摩,等等。更多讨论: http://mysql.rjweb.org/doc.php/staging_table
    • 那些绳子里是什么?它们是否可以/应该“正常化”?
    • 让我们讨论一下数学。你会在10点左右装货吗 拍字节 每年?你有那么多磁盘空间吗?您将如何处理这些数据?读取哪怕是一小部分数据都需要多长时间?还是将是一个“只写”数据库??
    • 更多数学知识。50K行*0.5KB=每秒25MB写入磁盘。你有什么设备?它能处理,比如说,2倍的问题吗?(对于原始模式,由于所有索引,它更像是60MB/s。)

    评论之后

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

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