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 设置最重要?

4

3 回答 3

5

插入索引通常会降低性能。在插入数据之前删除索引并在插入后重新索引可能会更好。

来自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

于 2009-05-06T04:07:38.603 回答
2

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

于 2009-05-06T00:02:52.637 回答
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;
于 2012-10-01T22:33:37.120 回答