我在服务器之间导出一个大表(15 亿行)。这是表格格式。
CREATE TABLE IF NOT EXISTS `partitionedtable` (
`domainid` int(10) unsigned NOT NULL,
`instanceid` int(10) unsigned NOT NULL,
`urlid` int(10) unsigned NOT NULL,
`adjrankid` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`domainid`,`instanceid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (MOD(domainid,8192))
(PARTITION p0 VALUES LESS THAN (1) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (2) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (3) ENGINE = InnoDB
...
PARTITION p8191 VALUES LESS THAN (8192) ENGINE = InnoDB)
数据以 PK 顺序导出到新服务器,生成 8192 个文本文件……相当于每个文件大约 200K 条记录。
我只是从 0 迭代到 8191 将文件导入新表。
LOAD DATA INFILE '/home/backup/rc/$i.tsv INTO TABLE partitionedtable PARTITION (p$i)
我认为这些中的每一个都应该只需要一秒钟来导入,但是它们大约需要 6 秒钟。
服务器的规格可以在这里看到。 http://www.ovh.co.uk/dedicated_servers/sp_32g.xml
服务器中没有太多其他事情会成为该过程的瓶颈。
难道是 MOD() 的分区会导致碎片?我的印象是不会有任何碎片,因为每个分区都将被视为一个单独的表,并且由于数据是以 PK 顺序插入的,因此不会有碎片。
添加 - 可能有用...这些设置在批处理开始时应用。
设置自动提交=0;SET foreign_key_checks=0; 设置 sql_log_bin=0;SET unique_checks=0;
在每个文件之后应用 COMMIT。
在 LOAD DATA INFILE 期间,线程似乎大部分时间都处于系统锁定状态。