代码之家  ›  专栏  ›  技术社区  ›  David Cournapeau

在MySQL中,插入速度随着表的增长而减慢

  •  7
  • David Cournapeau  · 技术社区  · 15 年前

    我正试图更好地理解MySQL中定制产品的插入速度和性能模式。我有两个表,我一直在向其中追加新行。这两个表定义如下:

    创建表事件(
    添加了不为空的自动递增主键,
    ID二进制(16)不为空,
    身体平卧,
    唯一键(id))引擎innodb;
    
    创建表索引(
    fpid varchar(255)不为空,
    事件_id binary(16)不为空唯一,
    主键(fpid,event_id))引擎innodb;
    < /代码> 
    
    

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

    我可以看到,随着表的增长,IO等待数越来越高。我的第一个想法是索引占用的内存,但是这些都是在一个拥有768 MB的虚拟机上完成的,并且只专门用于这个任务(有2/3的内存没有使用)。另外,我很难看到30000行占用了如此多的内存,甚至更多的是索引(整个mysql data dir<100MB)。为了确认这一点,我为虚拟机分配了很少的内存(64 MB),并且减速模式几乎是相同的(即,减速出现在相同数量的插入之后),因此我怀疑有些配置问题,特别是因为我对数据库比较陌生。

    模式如下:

    我有一个自包含的python脚本,它复制了这个问题,如果有用的话,我可以提供这个脚本。

    配置:

    • Ubuntu 10.04,32位在kvm上运行,760 MB分配给它。
    • MySQL5.1,开箱即用配置,表有单独的文件

    [编辑] < /P>

    非常感谢埃里克·霍姆伯格,他成功了。以下是将innodb缓冲池大小固定为合理值后的图形:.

    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的虚拟机上完成的,并且只专门用于此任务(有2/3的内存未使用)。另外,我很难看到30000行占用了如此多的内存,甚至更多的是索引(整个mysql data dir<100MB)。为了证实这一点,我为虚拟机分配了很少的内存(64MB),并且减速模式几乎是相同的(即在相同数量的插入之后出现减速),所以我怀疑一些配置问题,特别是因为我对数据库比较陌生。

    模式如下:alt text

    我有一个独立的python脚本,它复制了这个问题,如果有帮助的话,我可以提供这个脚本。

    配置:

    • Ubuntu10.04,在kvm上运行32位,分配给它760 MB。
    • MySQL5.1,开箱即用配置,表有单独的文件

    [编辑]

    非常感谢埃里克·霍姆伯格,他成功了。以下是将innodb缓冲池大小固定为合理值后的图表:

    3 回复  |  直到 15 年前
        1
  •  8
  •   Eric    15 年前

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

    http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

        3
  •  0
  •   Joshua Martell    15 年前

    LOAD DATA INFILE