INSERT INTO matched_articles
SELECT * FROM articles a LEFT JOIN info i ON a.id = i.article_id WHERE i.tag_id = 5;
INSERT INTO unmatched_articles
SELECT * FROM articles a WHERE a.id NOT IN (SELECT m.id FROM matched_articles m);
Здесь так много неправильного, я не уверен, с чего начать. ОК в вашей первой вставке вам не нужно левое соединение, на самом деле у вас его нет. Должно быть
INSERT INTO matched_articles
SELECT * FROM articles a INNER JOIN info i ON a.id = i.article_id WHERE i.tag_id = 5;
Если бы вам понадобилось левое соединение, у вас было бы
INSERT INTO matched_articles
SELECT * FROM articles a LEFT JOIN info i ON a.id = i.article_id AND i.tag_id = 5;
Когда вы помещаете что-то с правой стороны левого соединения в предложение where (кроме поиска нулевых значений), то вы конвертируете это во внутреннее соединение, потому что оно должно соответствовать этому условию, поэтому записи, которые не совпадение в правой таблице исключено.
Теперь второе утверждение можно сделать с помощью специального случая левого соединения, хотя то, что у вас есть, будет работать.
INSERT INTO matched_articles
SELECT * FROM articles a
LEFT JOIN info i ON a.id = i.article_id AND i.tag_id = 5
WHERE i.tag_id is null
Это даст вам все записи в информационной таблице, кроме тех, которые соответствуют таблице статей.
Теперь следующее, вы не должны писать вставные элементы без указания полей, которые вы хотите вставить. Также вы никогда не должны писать оператор выбора, используя select *, особенно если у вас есть соединение. Это обычно небрежное, ленивое кодирование и должно быть исправлено. Что если кто-то изменит структуру одной из таблиц, но не другой? Такие вещи плохи для обслуживания, и в случае выбора статистики с объединением, он возвращает столбец дважды (столбец объединения), а это пустая трата ресурсов сервера и сети. Это просто плохое кодирование, чтобы лень указывать, что вам нужно и только то, что вам нужно. Так что избавьтесь от привычки и не делайте этого снова для любого производственного кода.
Если ваша текущая позиция слишком медленная, вы также можете исправить ее с помощью правильных индексов. Индексируются ли поля идентификаторов в обеих таблицах? С другой стороны, если есть миллионы статей, потребуется время, чтобы вставить их. Часто лучше делать это партиями, может быть, 50000 за раз (еще меньше, если это занимает слишком много времени). Просто выполните цикл вставки ina, который выбирает верхние записи XXX, а затем зацикливается до тех пор, пока не будет затронуто число строк.