mysql查询选择键并插入

我有两个表: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

我有几百万个子词对,它们表示相应页面之间的超链接。我正在尝试从这些子弹对加载PageLinks表。

目前,我有一个python程序,该程序select id对每个段塞发出查询,以将段塞对转换为Article

id对。然后将ID对写入文件并使用加载load data

infile。此外,如果“文章”表中不存在子弹,程序将插入一个没有标签的虚拟行,然后使用该行的ID。

我正在尝试优化程序以更快地加载条目(我要加载大约18GB的子弹对)。我相信,如果可以批量执行slug->

id解析和页面链接插入,则可以达到一定的速度(从而避免了每次SELECT的开销)。在mysql中做到这一点的最佳方法是什么?

回答:

SELECT实际上,为每个弹头单独设置都是无效的。

您应该将子弹对加载到表中:

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;

以上是 mysql查询选择键并插入 的全部内容, 来源链接: utcz.com/qa/410104.html

回到顶部