mysql查询选择键并插入

时间:2011-03-24 15:54:20

标签: mysql sql bulkinsert

我有两个表:Articles存储有关文章的信息,PageLinks存储页面之间的超链接。架构如下。

CREATE TABLE `Articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `slug` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `label` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `slug_UNIQUE` (`slug`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

CREATE TABLE `PageLinks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `from_id` int(11) NOT NULL,
  `to_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index4` (`to_id`,`from_id`),
  KEY `fk_PageLinks_1` (`from_id`),
  KEY `fk_PageLinks_2` (`to_id`),
  CONSTRAINT `fk_PageLinks_1` FOREIGN KEY (`from_id`) REFERENCES `Articles` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_PageLinks_2` FOREIGN KEY (`to_id`) REFERENCES `Articles` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

我有几百万个子对,表示相应页面之间的超链接。我试图从这些slug对中加载PageLinks表。

目前,我有一个python程序,它为每个slug发出select id个查询,将slug对转换为Article id对。然后将id对写入文件并使用load data infile加载。另外,如果Articles表中不存在slug,程序会插入一个没有标签的虚拟行,然后使用该行的id。

我正在尝试优化程序以更快地加载条目(我有大约18GB的slug对加载)。我相信如果可以批量执行slug-> id解析和页面链接插入(从而避免每个SELECT开销),可以实现一些加速。在mysql中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

为每个slu a单独SELECT确实效率低下。

您应该将slug对加载到表中:

CREATE TABLE pairs
        (
        slug1 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
        slug2 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
        );

,加载你的对,然后发出以下声明:

INSERT IGNORE
INTO    Articles (slug)
SELECT  slug1
FROM    pairs;

INSERT IGNORE
INTO    Articles (slug)
SELECT  slug2
FROM    pairs;

INSERT
INTO    pairs (from_id, to_id)
SELECT  a1.id, a2.id
FROM    pairs
JOIN    articles a1
ON      a1.slug = slug1
JOIN    articles a2
ON      a2.slug = slug2;