什么mysql设置会影响LOAD DATA INFILE的速度?

时间:2009-05-05 23:51:03

标签: mysql performance load-data-infile bulk-load

让我说明情况。我们试图在一个适度宽的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设置最重要的是什么?

3 个答案:

答案 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;