2012-07-24 70 views
2

我有一个表像这样MySQL的INSERT INTO索引表需要长时间之后几百万条记录

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 */; 

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

要插入1000万条第一次记录需要近5分钟的记录。时间逐渐增加。在30万条记录停止插入和使用100%服务器没有响应的内存之后。

下面我my.cnf文件

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

我使用CPU搭配2G内存设置。

细节30万个记录

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

MySQL client version: 5.5.14 

与出索引它插入细1000万50秒。

请告诉我需要改变什么样的设置。

+0

'数字'需要是varchar吗?整数列上的索引肯定会更有效。 – Sam 2012-07-24 07:17:13

+0

@sam。数字必须是varchar。因为这些是手机号码,超出了整数值。 – 2012-07-24 07:20:32

+0

您可以使用BIGINT,但它仍然比varchar更快。 – Omesh 2012-07-24 07:28:35

回答

2

尝试:MySQL的修改配置文件后

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服务器:

ALTER TABLE dnddata DISABLE KEYS; 

LOAD DATA INFILE... 

ALTER TABLE dnddata ENABLE KEYS; 

同时配置的my.cnf作为。下面

公式可以帮助您配置参数正确:

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

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

在varchar列上创建PRIMARY KEY的开销很大,所以如果不需要,可以放弃它。

+0

谢谢你的回应。我会尝试发布反馈。 – 2012-07-24 07:16:24

+0

我试过以上设置。即使没有用。我已经等了10多万分钟。它没有完成。 – 2012-07-24 07:44:33

+0

我编辑了我的帖子。尝试禁用密钥,然后加载数据并启用密钥。 – Omesh 2012-07-24 07:49:57