Оптимизировать MySQL запрос в Python

0

Я подключаюсь к базе данных MySQL с помощью MySQL-коннектора в Python. При обычном запуске событий мне не нужно обрабатывать более 1000 строк, но иногда мне может потребоваться обработать 20 000 строк данных плюс строки, и в этом случае мой запрос становится очень медленным и время ожидания истекает. Я попытался использовать итератор в MySQL-коннектор, чтобы ограничить объем, который я обрабатываю в данный момент, но кажется, что это реализовано только для MySQLdb в Py.

SELECT
        ROUND(311.30004 - (20.110938 * temp.value) 
        - (2.012626 * hum.value) - (2.006346 * airspeed.value) 
        + (0.4059 * POWER(temp.value, 2) + (0.006604 * POWER(hum.value, 2)) 
        + (3.151145 * POWER(airspeed.value, 2) + (0.05555 * temp.value * hum.value) 
        - (0.37037 * temp.value * airspeed.value) + (0.03968 * hum.value * airspeed.value))), 2) 
        AS value, temp.time, temp.x, temp.y, temp.z, temp.round_id, 'predicted_frequency', temp.round_number, temp.day_of_production
FROM round_data_temperature AS temp 
    INNER JOIN round_data_humidity AS hum 
        ON temp.round_number = hum.round_number 
           AND temp.x = hum.x 
           AND temp.y = hum.y AND DATE_FORMAT(temp.time, '%Y-%m-%d %H:%i:00') = DATE_FORMAT(hum.time, '%Y-%m-%d %H:%i:00')
    INNER JOIN round_data_airspeed AS airspeed 
        ON temp.round_number = airspeed.round_number 
            AND temp.x = airspeed.x AND temp.y = airspeed.y 
            AND DATE_FORMAT(temp.time, '%Y-%m-%d %H:%i:00') = DATE_FORMAT(airspeed.time, '%Y-%m-%d %H:%i:00')
WHERE temp.round_id ='xxxxx'

Этот код работает очень быстро только на mysql, но очень медленный и время ожидания в mysql-соединителе в python с 20k плюс строки, поэтому я решил вставить сразу, чтобы избежать выбора очень больших пакетов данных в python. Я сделал ниже:

INSERT INTO round_data_pf (value, time, x, y, z, round_id, observable_name, round_number, day_of_production)
SELECT
        ROUND(311.30004 - (20.110938 * temp.value) 
        - (2.012626 * hum.value) - (2.006346 * airspeed.value) 
        + (0.4059 * POWER(temp.value, 2) + (0.006604 * POWER(hum.value, 2)) 
        + (3.151145 * POWER(airspeed.value, 2) + (0.05555 * temp.value * hum.value) 
        - (0.37037 * temp.value * airspeed.value) + (0.03968 * hum.value * airspeed.value))), 2) 
        AS value, temp.time, temp.x, temp.y, temp.z, temp.round_id, 'pf', temp.round_number, temp.day_of_production
FROM round_data_temperature AS temp 
    INNER JOIN round_data_humidity AS hum 
        ON temp.round_number = hum.round_number 
            AND temp.x = hum.x 
            AND temp.y = hum.y 
            AND DATE_FORMAT(temp.time, '%Y-%m-%d %H:%i:00') = DATE_FORMAT(hum.time, '%Y-%m-%d %H:%i:00')
    INNER JOIN round_data_airspeed AS airspeed 
        ON temp.round_number = airspeed.round_number 
            AND temp.x = airspeed.x 
            AND temp.y = airspeed.y 
            AND DATE_FORMAT(temp.time, '%Y-%m-%d %H:%i:00') = DATE_FORMAT(airspeed.time, '%Y-%m-%d %H:%i:00')
WHERE temp.round_id ='xxxxx'

Этот код истекает как в MySQL, так и MySQL-соединителя в Python, когда у меня есть около 20 000 строк данных.

Я ищу, чтобы оптимизировать код, чтобы он выбирал и вставлял быстрее, когда я скажу 20k плюс строки.

  • 0
    Не очень ясно в вашем вопросе, это быстро в MySQL по сравнению с медленным в Python на том же количестве данных?
  • 0
    В MySQL без вставки он выполняется менее чем за 2 секунды с около 20 тыс. Строк данных. Со вставкой время ожидания истекло. В python в обоих случаях время ожидания составляет около 20 тыс. Строк данных.
Показать ещё 13 комментариев
Теги:
mysql-connector-python

1 ответ

0

убедитесь, что у вас есть правильный индекс на

table round_data_temperature composite index  on columns (round_id, round_number, x, y,  time)

table  round_data_humidity     composite index  on columns (round_number, x, y time) 

table  round_data_airspeed   comoosite index on clumns (round_number, x, y,time   )

Вы должны учитывать тот факт, что каждая таблица, участвующая в отношении, может использовать только один индекс. Если у вас нет индекса для таблицы, таблица полностью сканируется.

Разница между индексом одного столбца и составным индексом состоит в том, что все столбцы (слева направо), присутствующие в индексе, используются для фильтрации запроса, избегая доступа к данным таблицы, поэтому в определенных ситуациях использование составного индекса (правильно определено) ) может значительно улучшить запрос..

  • 0
    Я индексировал свои строки, но не так сложный, как со временем. Сейчас я буду индексировать время, но есть ли разница между нормальным индексом и составным индексом? Если так, я сделаю их составными индексами.
  • 1
    @ J. Так что запрос не может использовать индексы вовремя так, как он написан. Если у вас нет индексов, запрос полностью сканирует обе таблицы
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню