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