Фокусировка на ...
SELECT ...
from g4_airport AS g4
join airport AS a
ON g4.code = case g4.code_type
when 'iata' then a.iata_code
when 'faa' then a.local_code
when 'icao' then a.ident end
where a.country_iso = 'us'
order by a.iata_code;
Пожалуйста, попробуйте эти и укажите EXPLAIN SELECT ...
и время.
Бросьте DISTINCT
, я не думаю, что это необходимо , по крайней мере, не в моих мыслях 2,3.
Мысль № 1: INDEX(country_iso, iata_code)
Мысль № 2:
( SELECT ...
from g4_airport AS g4
join airport AS a
ON g4.code_type = 'iata'
AND g4.code = a.iata_code
where a.country_iso = 'us'
order by a.iata_code;
) UNION ALL
( SELECT ...
from g4_airport AS g4
join airport AS a
ON g4.code_type = 'faa'
AND g4.code = a.local_code
where a.country_iso = 'us'
)
) UNION ALL
( SELECT ...
... icao...ident
)
ORDER BY a.iata_code;
airport: INDEX(country_iso) -- although it may not be used
g4_airport: INDEX(code_type, code) -- for each `JOIN`
Мысль № 3:
Сначала получите идентификаторы, затем просмотрите детали
SELECT a..., g4... -- the various columns desired
FROM
( -- start of UNION
( SELECT a.id AS aid, g4.id AS g4id -- only the PKs
from g4_airport AS g4
join airport AS a
ON g4.code_type = 'iata'
AND g4.code = a.iata_code
where a.country_iso = 'us'
order by a.iata_code;
) UNION ALL
( SELECT a.id AS aid, g4.id AS g4id
from g4_airport AS g4
join airport AS a
ON g4.code_type = 'faa'
AND g4.code = a.local_code
where a.country_iso = 'us'
)
) UNION ALL
( SELECT ...
... icao...ident
)
) AS u -- end of the UNION
JOIN airport AS a WHERE a.id = u.aid
JOIN ga_airport AS g4 WHERE g4.id = u.g4id
ORDER BY u.iata_code;
airport: INDEX(country_iso) -- although it may not be used
g4_airport: INDEX(code_type, code) -- for each `JOIN`
(я предполагаю, что id
является PRIMARY KEY
, если каждая таблица.)
Я не знаю, будет ли мысль №3 быстрее, чем # 2.
(Мысли № 2,3 могут иметь таблицы назад.)