Что-то в строках следующего кода должно помочь.
@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
file = request.files['file']
extension = os.path.splitext(file.filename)[1]
f_name = str(uuid.uuid4()) + extension
file.save(os.path.join(app.config['UPLOAD_FOLDER'], f_name))
return json.dumps({'filename':f_name})
Фокусировка на ...
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 могут иметь таблицы назад.)
MySQL не может использовать индекс для соединения.
Вы можете использовать объединение по трем объединениям (по одному для iata, faa, icao).