Я пытаюсь упростить некоторые задачи и вместо сценария bash, который порождает несколько процессов mysqlclient, я считаю, что хранимые процедуры на самом деле будут более быстрым методом
Я пробовал некоторые скрипты Python и некоторые другие скрипты bash, и они работают нормально, но мне любопытно, будет ли лучше хранимая процедура с несколькими триггерами событий
Примечание. Это будет применяться к ~ 700 идентичным схемам БД и запускаться одновременно или последовательно через сценарии (некоторые советы также будут полезны. Если это будет лучше, если вы попытаетесь использовать многопоточность с идентификатором Python, например, знать
USE `<db>`;
DROP procedure IF EXISTS `archive_table`;
DELIMITER //
USE `basegps3`//
CREATE PROCEDURE `archive_table`(IN trunc_date DATETIME)
BEGIN
DECLARE max_loc_id INT DEFAULT 1;
SELECT IFNULL(MAX(location_id),1) INTO max_loc_id FROM location;
INSERT IGNORE INTO arc_location SELECT * FROM location WHERE update_time < trunc_date AND location_id != max_loc_id;
DELETE FROM location WHERE update_time < trunc_date AND location_id != max_loc_id;
INSERT IGNORE INTO location SELECT l.* FROM arc_location l INNER JOIN vehicle_info USING(location_id);
DELETE FROM arc_location WHERE location_id IN (SELECT location_id FROM vehicle_info);
INSERT IGNORE INTO arc_message SELECT * FROM message WHERE create_time < trunc_date;
DELETE FROM message WHERE create_time < trunc_date;
INSERT IGNORE INTO arc_qt_answer SELECT * FROM qt_answer WHERE date_time < trunc_date;
INSERT IGNORE INTO arc_phone_error SELECT * FROM phone_error WHERE timestamp < trunc_date;
DELETE FROM phone_error WHERE timestamp < trunc_date;
INSERT IGNORE INTO arc_status_change SELECT * FROM status_change WHERE timestamp < trunc_date AND most_recent = 0;
DELETE FROM status_change WHERE timestamp < trunc_date and most_recent = 0;
INSERT IGNORE INTO arc_area_points SELECT * FROM area_points WHERE area_id IN (SELECT area_id FROM area WHERE expire_time IS NOT NULL AND expire_time < trunc_date AND area_type_id = 1);
DELETE FROM area_points WHERE area_id IN (SELECT area_id FROM area WHERE expire_time IS NOT NULL AND expire_time < trunc_date AND area_type_id = 1);
INSERT IGNORE INTO arc_hotspot SELECT * FROM hotspot WHERE area_id IN (SELECT area_id FROM area WHERE expire_time IS NOT NULL AND expire_time < trunc_date AND area_type_id = 1);
DELETE FROM hotspot WHERE area_id IN (SELECT area_id FROM area WHERE expire_time IS NOT NULL AND expire_time < trunc_date AND area_type_id = 1);
INSERT IGNORE INTO arc_area SELECT * FROM area WHERE expire_time IS NOT NULL AND expire_time < trunc_date AND area_type_id = 1;
DELETE FROM area WHERE expire_time IS NOT NULL AND expire_time < trunc_date AND area_type_id = 1;
INSERT IGNORE INTO arc_area_time SELECT * FROM area_time WHERE exit_timestamp IS NOT NULL AND exit_timestamp < trunc_date;
DELETE FROM area_time WHERE exit_timestamp IS NOT NULL AND exit_timestamp < trunc_date;
INSERT IGNORE INTO arc_ed_sample_data SELECT * FROM ed_sample_data WHERE timestamp < trunc_date;
DELETE FROM ed_sample_data WHERE timestamp < trunc_date;
END//
DELIMITER ;```