Оптимизировать MySQL запрос в Python - PullRequest
0 голосов
/ 04 апреля 2019

Я подключаюсь к базе данных 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 тыс. Строк данных.

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

1 Ответ

0 голосов
/ 04 апреля 2019

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

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   )

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

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

...