Оптимизировать MySQL запрос - PullRequest
0 голосов
/ 02 августа 2011

У меня есть две таблицы с почти одинаковыми столбцами, за исключением того, что Table2 имеет три дополнительных столбца в конце Old_Column2, Old_Column3 and Column4. Если запись существует в Таблица1 и Таблица2, Таблица2 перекрывает запись в Таблице1, в противном случае отображаются записи из Таблицы1. Запрос до UNION позаботится об этом.

Теперь я также хочу записи, которые существуют в Таблице2, но не в Таблице1. Это пункт UNION. Однако с UNION VIEW становится медленным.

Я не могу использовать LEFT JOIN сейчас. Я думал об использовании FULL JOIN вместо этого, но это может быть слишком медленно. Какой оптимальный способ сделать это?

Перефразировать Select all records from Table1, if the same record exists in Table2 overlay the record in the view. Add the new records where Old_Column2 and 3 equals to new

Вот оператор VIEW, который я использую.

CREATE VIEW AVIEW AS
SELECT
    IF(U.Column1 IS NULL, L.Column1, U.Column1) Column1,
    IF(U.Column1 IS NULL, L.Column2, U.Column2) Column2,
    IF(U.Column1 IS NULL, L.Column3, U.Column3) Column3,
    IF(U.Column1 IS NULL, NULL, U.Old_Column2) Old_Column2,
    IF(U.Column1 IS NULL, NULL, U.Old_Column3) Old_Column3,
    IF(U.Column1 IS NULL, NULL, U.Column4) Column4
FROM
    Table1 L
LEFT JOIN Table2 U
    ON L.Column1 = U.Column1 AND L.Column2 = U.Old_Column2 AND L.Column3 = U.Old_Column3
WHERE 
    U.Column1 IS NULL OR U.Column1 IS NOT NULL AND U.Column4 = 0
UNION
    SELECT * FROM Table2 WHERE Old_Column2 = 'new' AND Old_Column3 = 'new' and Column4 = 0

1 Ответ

0 голосов
/ 02 августа 2011

К сожалению, вы не можете сделать FULL OUTER JOIN в MySQL. Вы должны смоделировать это, используя 2 отдельных LEFT OUTER JOIN запроса и union их вместе.

Одна вещь, которую вы можете попытаться повысить производительность, это проиндексировать Table2 в столбцах Old_ * и посмотреть, работает ли этот предикат быстрее.

...