让我说明情况。我们试图在一个适度宽的MyISAM表中插入适度数量的行(大约每天10-20M):
+--------------+--------------+------+-----+---------+-------+
| 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设置最重要的是什么?
答案 0 :(得分:5)
插入索引通常会导致性能下降。在插入数据和重新编制索引之前,最好先删除索引。
来自http://forum.percona.com/s/m/983/:
通常MySQL的加载速度相当快 MyISAM表中的数据,但有 例外,这是不可能的 按排序重建索引但构建 他们一行一行。有可能 因配置错误而发生 (即太小了 myisam_max_sort_file_size或 myisam_max_extra_sort_file_size)或它 可能只是缺乏优化,如果 你有大(不适合 memory)PRIMARY或UNIQUE索引。
另请查看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。
答案 1 :(得分:1)
我不知道有关设置的信息,但我的钱是在那个复合主键上,为什么你的表现如此糟糕。
答案 2 :(得分:1)
如果您的表是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命令加载数据之前禁用索引:
alter table t disable keys;