我试图更好地了解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;
Run Code Online (Sandbox Code Playgroud)
我继续向两个表插入新对象(对于每个新对象,我在一个事务中将相关信息插入到两个表中).起初,我得到大约600次插入/秒,但是在大约30000行之后,我得到了显着的减速(大约200次插入/秒),然后是一个更慢,但仍然明显的减速.
我可以看到随着表的增长,IO等待数量越来越高.我的第一个想法是由索引占用的内存,但这些是在具有768 Mb的VM上完成的,并且仅用于此任务(2/3的内存未使用).此外,我很难看到30000行占用了大量内存,甚至更多只是索引(整个mysql数据目录<100 Mb).为了确认这一点,我为VM分配了很少的内存(64 Mb),并且减速模式几乎相同(即在相同数量的插入后出现减速),所以我怀疑一些配置问题,特别是因为我相对较新数据库.
模式如下: 
我有一个自包含的python脚本,它可以重现这个问题,如果有帮助我可以提供.
组态:
[编辑]
非常感谢Eric Holmberg,他把它钉了下来.以下是将innodb_buffer_pool_size修复为合理值后的图表:
编辑/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
Run Code Online (Sandbox Code Playgroud)
主键是B树,因此插入总是需要O(logN)时间,一旦你用完了缓存,它们就会像疯了一样开始交换.发生这种情况时,您可能希望对数据进行分区以提高插入速度.有关分区的详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/partitioning.html.
祝好运!
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |