我有一张包含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来快速插入? 还是有比上面两个更好的程序?
谢谢。
答案 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
不要忘记将缺少的索引添加到新表中。