2

我在服务器之间导出一个大表(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 期间,线程似乎大部分时间都处于系统锁定状态。

4

1 回答 1

0

当我设置服务器时,我错误地认为打开文件的限制更高,但实际上它是 1024。

我已将其提高到 16000 并重新启动服务器,它的运行速度略快@ 3 秒(我假设文件打开/关闭导致系统锁定状态)。

我还清除了垃圾箱日志。

不过似乎还是有点慢。

于 2013-06-25T17:36:42.827 回答