让我说明一下情况 . 我们试图将适度数量的行(大约每天10-20M)插入到适度宽的MyISAM表中:
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| blah1 | varchar(255) | NO | PRI | | |
| blah2 | varchar(255) | NO | PRI | | |
| blah3 | varchar(5) | NO | PRI | | |
| blah4 | varchar(5) | NO | PRI | | |
| blah5 | varchar(2) | NO | PRI | | |
| blah6 | varchar(2) | NO | PRI | | |
| blah7 | date | NO | PRI | | |
| blah8 | smallint(6) | NO | PRI | | |
| blah9 | varchar(255) | NO | PRI | | |
| blah10 | bigint(20) | YES | | NULL | |
+--------------+--------------+------+-----+---------+-------+
除了那个高级主键之外唯一的索引是在blah7,即日期字段 . 我们正在使用LOAD DATA INFILE并看到令我感觉非常糟糕的性能,加载数据大约需要2个小时 . 我被引导相信LOAD DATA INFILE比这快几个数量级 .
有趣的是,我们有一些不那么胖的表(5-6个字段),我们也使用LOAD DATA INFILE批量处理数据,我们看到它们的性能要好得多 . 记录的数量相当小,这让我认为当我们加载大表时,我们正在运行缓冲区大小限制,并且必须转到磁盘(实际上,除了转到磁盘之外还有其他什么解释这么慢的加载时间?) .
......这让我想到了我的问题 . 处理LOAD DATA INFILE命令时my.cnf设置最重要的是什么?
3 回答
插入索引通常会导致性能下降 . 在插入数据和重新索引之前删除索引可能会更好 .
来自http://forum.percona.com/s/m/983/:
另请查看http://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/和http://www.linuxtopia.org/online_books/database_guides/mysql_5.1_database_reference_guide/insert-speed.html .
我不知道有关设置的问题,但我的钱是关于为什么你有这么糟糕的表现的复合主键 .
如果您的表是MyISam,并且数据被添加到非空表,则bulk_insert_buffer_size很重要
在将数据添加到非空表时,MyISAM使用特殊的树状缓存为LOAD DATA INFILE更快地批量插入 . BULK_INSERT_BUFFER_SIZE变量以每个线程的字节数限制缓存树的大小 . 将其设置为0将禁用此优化 . 默认值为8MB . 最大值为4GB .
如果将数据添加到非空表中,则调整bulk_insert_buffer_size变量可以使数据插入更快 . 通常,它表示当要插入的数据超过10k行时的改进 . 但是很难说什么是正确的值,因此,跟踪并尝试使用增量缓冲区大小值 .
此外,如果还设置了以下变量,性能改进将更加明显:
MYISAM_SORT_BUFFER_SIZE
KEY_BUFFER_SIZE
您还应该考虑在使用以下alter table命令加载数据之前禁用索引: