【问题标题】:Insertion speed slowdown as the table grows in mysql随着表在mysql中的增长,插入速度变慢
【发布时间】:2010-09-30 02:36:26
【问题描述】:

我正在尝试更好地了解自定义产品在 mysql 中的插入速度和性能模式。我有两个表,我不断向其中添加新行。这两个表定义如下:

CREATE TABLE events (
 added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 id BINARY(16) NOT NULL,
 body MEDIUMBLOB,
 UNIQUE KEY (id)) ENGINE InnoDB;

CREATE TABLE index_fpid (
 fpid VARCHAR(255) NOT NULL,
 event_id BINARY(16) NOT NULL UNIQUE,
 PRIMARY KEY (fpid, event_id)) ENGINE InnoDB;

并且我不断向两个表中插入新对象(对于每个新对象,我在一个事务中将相关信息插入到两个表中)。起初,我的插入速度约为 600 次/秒,但在大约 30000 行之后,我的速度明显放缓(大约 200 次插入/秒),然后速度更慢,但仍然明显放缓。

我可以看到随着表的增长,IO 等待数越来越高。我的第一个想法是索引占用的内存,但这些是在具有 768 Mb 的 VM 上完成的,并且专门用于此任务(2/3 的内存未使用)。此外,我很难看到 30000 行占用了这么多内存,更何况只是索引(整个 mysql 数据目录无论如何都

模式如下:

我有一个独立的 python 脚本,可以重现该问题,如果有帮助,我可以提供。

配置:

  • Ubuntu 10.04,在 KVM 上运行 32 位,分配给它 760 Mb。
  • Mysql 5.1,开箱即用的配置,带有单独的表文件

[编辑]

非常感谢 Eric Holmberg,他成功了。以下是将 innodb_buffer_pool_size 固定为合理值后的图表:

【问题讨论】:

  • 写入驱动器的问题,无论是虚拟的还是其他的。
  • 我不确定我是否理解您的意思:我知道写入磁盘需要时间,但这并不能解释随着表的增长而变慢。

标签: mysql performance


【解决方案1】:

编辑您的 /etc/mysql/my.cnf 文件并确保为 InnoDB 缓冲池分配足够的内存。如果这是专用服务器,您可能会使用多达 80% 的系统内存。

# Provide a buffer pool for InnoDB - up to 80% of memory for a dedicated database server
innodb_buffer_pool_size=614M

主键是 B 树,因此插入总是需要 O(logN) 时间,一旦缓存用完,它们就会开始疯狂交换。发生这种情况时,您可能希望对数据进行分区以保持插入速度。有关分区的更多信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

祝你好运!

【讨论】:

  • 就是这样,非常感谢。我将更新图表以显示差异,这非常引人注目。感谢分区提示:我已经在研究分区了,但我不想在没有先了解这个问题的情况下去那里。
  • 感谢您加倍努力更新图表 - 第二组看起来很棒!
【解决方案2】:

您的索引可能只需要在插入过程中进行分析和优化,随着您的进行,它们会逐渐变形。当然,另一种选择是在您稍后插入和重建索引时完全禁用索引,这应该会提供更一致的性能。

Great link about insert speed.

ANALYZEOPTIMIZE

【讨论】:

  • 只有两个索引——主键和唯一约束。两者都强制执行唯一值。除非有删除,否则没有任何东西需要维护。
  • 我不认为我可以禁用索引(在我的应用程序中,我需要在写入后立即使插入可用,并且插入是“实时”的,它是不是批处理)。
  • 我相信你,我的天啊,如果你这么说,我急切地等待你的回答,这样我就可以学习了。
【解决方案3】:

验证插入不违反键约束需要一些时间,并且随着表的变大,时间也会增加。如果您对完全性能感兴趣,使用LOAD DATA INFILE 将大大提高您的插入速度。

【讨论】:

  • 我预计随着表的增长插入速度会变慢(因为索引更新的日志(N)成本)。但是这里的减速是由增加的 IO 引起的,如果我相信 iowait %,这是出乎意料的(因为我有一个小到可以完全放入内存的数据集)。此外,我的图表没有显示 log(N) 减速。
  • 您的整个数据集都适合内存的情况很少见,但我很高兴您的问题得到了解决。如果您有这样的要求,LOAD DATA INFILE 仍会向您展示进一步的性能改进。
猜你喜欢
  • 2020-02-19
  • 2016-02-13
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
相关资源
最近更新 更多