mysql插入到索引表中需要很长时间才能完成几百万条记录

时间:2012-07-24 07:09:11

标签: mysql performance myisam load-data-infile

我有一张这样的表

CREATE TABLE IF NOT EXISTS `dnddata` (
  `numbers` varchar(10) NOT NULL,
  `opstype` char(1) NOT NULL,
  PRIMARY KEY (`numbers`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
/*!50100 PARTITION BY KEY (numbers)
PARTITIONS 25 */;

我必须插入3亿条记录。我每次使用csv文件中的load data in file插入1000万条记录。

首次插入近5分钟的1000万条记录。时间逐渐增加。在3000万条记录之后,它使用100%服务器无响应来停止插入和内存。

低于我的my.cnf文件设置

bulk_insert_buffer_size = 100M
key_buffer = 100M
sort_buffer_size = 50M
read_buffer = 50M

我正在使用带有2 G内存的cpu。

3000万条记录的详细信息

    Space usage
Type    Usage
Data    545.3   MiB
Index   694.8   MiB
Total   1,240.1 MiB

MySQL client version: 5.5.14

没有索引它会在50秒内插入1000万美元。

请告诉我需要更改哪种设置。

1 个答案:

答案 0 :(得分:2)

尝试:

ALTER TABLE dnddata DISABLE KEYS;

LOAD DATA INFILE...

ALTER TABLE dnddata ENABLE KEYS;

还将my.cnf配置为:

key_buffer_size = 1G
sort_buffer_size = 4M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
join_buffer_size = 2M
bulk_insert_buffer_size = 32M
myisam_sort_buffer_size = 256M

修改MySQL配置文件后重启MySQL服务器。

下面的

公式可能有助于您正确配置参数:

key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = K bytes of memory (< 2GB)

你真的需要数字作为varchar(10)吗?使它成为char(10)或int将有助于提高性能。

在varchar列上创建PRIMARY KEY是开销,因此如果不需要,可以删除它。