首页 文章

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

提问于
浏览
5

让我说明一下情况 . 我们试图将适度数量的行(大约每天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 回答

  • 1

    插入索引通常会导致性能下降 . 在插入数据和重新索引之前删除索引可能会更好 .

    来自http://forum.percona.com/s/m/983/

    通常MySQL在MyISAM表中加载数据的速度相当快,但是有异常,也就是说它不能按排序重建索引,而是逐行构建它们 . 它可能由于错误的配置(即myisam_max_sort_file_size或myisam_max_extra_sort_file_size太小)而发生,或者只是缺少优化,如果你有大的(不适合内存)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

    我不知道有关设置的问题,但我的钱是关于为什么你有这么糟糕的表现的复合主键 .

  • 5

    如果您的表是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;
    

相关问题