InnoDB分区表上的MOD(主键)是否会导致碎片

时间:2013-06-25 10:59:03

标签: mysql innodb partitioning modulus

我在服务器之间导出一个大表(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顺序插入的,所以没有碎片。

  • 已添加 - 可能很有用......这些设置已在批处理开始时应用。

    SET autocommit = 0; SET foreign_key_checks = 0; SET sql_log_bin = 0; SET unique_checks = 0;

每个文件后都会应用COMMIT。

在LOAD DATA INFILE期间,线程似乎将大部分时间花在系统锁定状态。

1 个答案:

答案 0 :(得分:0)

当我设置服务器时,我错误地认为开放文件限制较高,但实际上它位于1024.

我已将它提升到16000并重新启动服务器,并且它在3秒后运行得稍微快一点(我假设文件打开/关闭导致系统锁定状态)。

我也清除了垃圾箱日志。

虽然看起来有点慢。