哪一个是快速加载数据infile或正常插入?

时间:2013-11-30 07:47:55

标签: mysql insert bulkinsert load-data-infile

我有一张包含4000万条记录的表格,我想将这个40M复制到80M这样 -

INSERT INTO cdr (id,dataPacketDownLink, dataPacketUpLink,dataPlanEndTime,dataPlanStartTime,dataVolumeDownLink,dataVolumeUpLink,
dataplan,dataplanType, createdOn, deviceName, duration, effectiveDuration, HOUR, eventDate, msisdn, QUARTER, validDays, dataLeft,completedOn,evedate)SELECT null,dataPacketDownLink, dataPacketUpLink,dataPlanEndTime,dataPlanStartTime,dataVolumeDownLink,dataVolumeUpLink,
dataplan,dataplanType, createdOn, deviceName, duration, effectiveDuration, HOUR, eventDate, msisdn, QUARTER, validDays, dataLeft,completedOn,eve_date FROM cdr;

使用这个是正确的还是我应该使用SELECT INTO OUTFILE和LOAD DATA INFILE来快速插入? 还是有比上面两个更好的程序?

谢谢。

2 个答案:

答案 0 :(得分:2)

您当前的解决方案相当不错,但如果您的表有很多索引,那么可能会减慢速度。索引适合搜索,但会减慢插入速度。

您可以先尝试删除所有(或大多数)索引,复制所有数据,然后重新创建它们。或者,您可以构造一个没有索引的新表,复制那里的所有数据,在新表上创建索引,然后删除旧表并重命名新表。

尽管如此,我已经看到过这么长时间以来对这种尺寸的桌子进行了修改。这很不幸,但MySQL在这些方面并不是很快。

答案 1 :(得分:1)

为避免在此操作中隐含地创建大的TEMPORARY TABLE(插入正在选择的表中),您可以尝试以下选项:

CREATE TABLE cdr2 AS
SELECT dataPacketDownLink, dataPacketUpLink,dataPlanEndTime,dataPlanStartTime,dataVolumeDownLink,dataVolumeUpLink,
dataplan,dataplanType, createdOn, deviceName, duration, effectiveDuration, HOUR, eventDate, msisdn, QUARTER, validDays, dataLeft,completedOn,evedate 
FROM cdr
UNION ALL
SELECT dataPacketDownLink, dataPacketUpLink,dataPlanEndTime,dataPlanStartTime,dataVolumeDownLink,dataVolumeUpLink,
dataplan,dataplanType, createdOn, deviceName, duration, effectiveDuration, HOUR, eventDate, msisdn, QUARTER, validDays, dataLeft,completedOn,evedate 
FROM cdr;

ALTER TABLE cdr2 ADD COLUMN (id INT(10) NOT NULL UNIQUE AUTO_INCREMENT)

一旦你检查了cdr2中的一切正常,你可以:

  • DROP TABLE cdr
  • RENAME TABLE cdr2 TO cdr

不要忘记将缺少的索引添加到新表中。