【问题标题】:What mysql settings affect the speed of LOAD DATA INFILE?哪些 mysql 设置会影响 LOAD DATA INFILE 的速度?
【发布时间】:2010-10-24 01:39:37
【问题描述】:

让我设置一下情况。我们正在尝试将适量的行数(每天大约 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 设置最重要?

【问题讨论】:

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


    【解决方案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

    【讨论】:

      【解决方案2】:

      我不知道设置,但我的钱花在了那个复合主键上,为什么你的性能这么差。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-13
          • 2012-10-05
          • 2010-11-17
          • 1970-01-01
          • 2011-04-27
          • 1970-01-01
          • 2017-07-21
          • 2012-06-01
          相关资源
          最近更新 更多