Предложение индекса MySQL

Что-то в строках следующего кода должно помочь.

 @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})
-1
задан user1018926 13 July 2018 в 18:01
поделиться

2 ответа

Фокусировка на ...

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 могут иметь таблицы назад.)

0
ответ дан Rick James 17 August 2018 в 12:18
поделиться

MySQL не может использовать индекс для соединения.

Вы можете использовать объединение по трем объединениям (по одному для iata, faa, icao).

0
ответ дан Xypron 17 August 2018 в 12:18
поделиться
  • 1
    MySQL не может использовать индексы для JOINS? действительно? MySQL не может использовать индекс для соединения стартеров темы из-за оператора CASE. – Raymond Nijland 13 July 2018 в 18:36
Другие вопросы по тегам:

Похожие вопросы: