«Insert Ignore» неэффективно, когда тот же SQL повторно выполняется позднее, так как он попытается повторно вставить ВСЕ записи. Вы ДОЛЖНЫ ограничить попытки вставки до минимально возможного количества для лучшей производительности системы.
Использование запросов на дополнительный выбор также неэффективно, «левое соединение» почти всегда быстрее при работе с большими наборами данных. Запросы дополнительного выбора становятся ужасными в предложении SELECT. Используйте 'IFNULL ()' в предложении SELECT вокруг полей из таблицы LEFT JOINed, чтобы указать значения по умолчанию для отсутствующих записей / NULL.
Ответ Томалака работает, но вот чистый пример «LEFT JOIN».
INSERT INTO tbl_productcategorylink (p_pid, pcl_cat_id, pcl_orderby )
SELECT prod.p_pid, IFNULL( cat.cat_id,0 ), 1 AS pcl_orderby
FROM tbl_products AS prod
LEFT JOIN tbl_categories AS cat ON cat.cat_url_tag = IF(prod.p_gender='female','womans','mens')
LEFT JOIN tbl_productcategorylink AS pcl ON pcl.pcl_p_id = prod.p_id
WHERE prod.p_gender IN ('female','male')
AND pcl.pcl_p_id IS NULL -- Optimizes to faster "NOT EXISTS IN (Select ... From pcl )"
Эта перезапись предполагает, что tbl_categories имеет две конкретные записи: 'womans' и 'mens'.
Обратите внимание, что предложение where содержит «pcl_p_pid IS NULL», которое оптимизируется для более быстрой версии «NOT EXISTS IN (Select * From tbl_productcategorylink ...)» при работе с очень большими наборами данных.
Запросы Sub-select выполняют одну из двух вещей:
а) создает временную таблицу.
b) выполняет поиск в выбранной таблице для КАЖДОЙ записи, которая МОЖЕТ быть в ней, когда база данных проходит по основной таблице «От». Это преувеличивает до ужасной производительности, когда в предложении SELECT есть подвыбор.
ЛЕВЫЕ СОЕДИНЕНИЯ используют уже эффективную логику СОЕДИНЕНИЯ, предоставляемую базой данных, с учетом пропущенных записей.
- Дж. Йоргенсон -