mysql consulta seleccionar teclas e insert

Tengo dos tablas: Articles que almacenan información sobre artículos y PageLinks que almacena hyperlinks entre páginas. El esquema es el siguiente.

 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 

Tengo varios millones de pares de slug que indican hyperlinks entre las páginas correspondientes. Estoy intentando cargar la tabla PageLinks de estos pares de slug.

Actualmente, tengo un progtwig python que emite consultas de select id para cada babosa para convertir los pares de babosas en pares de id. De artículo. Los pares de id se escriben luego en un file y se cargan usando load data infile . Además, si no existe una babosa en la tabla Artículos, el progtwig inserta una fila ficticia sin label y luego usa la identificación de esa fila.

Estoy tratando de optimizar el progtwig para cargar inputs más rápido (tengo alnetworkingedor de 18 GB de pares de slug para cargar). Creo que se puede lograr cierta velocidad si es posible hacer la resolución slug-> id y la inserción del enlace de página juntas a granel (evitando así la tara por SELECT). ¿Cuál es la mejor manera de hacer esto en mysql?

Hacer un SELECT por separado para cada babosa es ineficiente.

Deberías cargar tus pares de babosas en una table:

 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 ); 

, cárguelo con sus pares, luego emita las siguientes afirmaciones:

 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;