【发布时间】: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