CREATETABLE orders (
id INT,
order_date DATE,
amount DECIMAL(10,2))PARTITIONBY RANGE (YEAR(order_date))(PARTITION p2022 VALUES LESS THAN (2023),PARTITION p2023 VALUES LESS THAN (2024),PARTITION pmax VALUES LESS THAN MAXVALUE
);
执行函数
CREATEDEFINER=`ry-vue`@`%`PROCEDURE`MigrateData`()BEGINDECLARE batch_size BIGINTDEFAULT5000;DECLARE max_id BIGINTDEFAULT0;DECLARE min_id BIGINTDEFAULT0;DECLARE current_id BIGINTDEFAULT0;DECLARE rows_affected BIGINTDEFAULT1;DECLARE next_id BIGINTDEFAULT0;-- 使用事务确保数据一致性DECLAREEXITHANDLERFOR SQLEXCEPTION
BEGINROLLBACK;RESIGNAL;END;STARTTRANSACTION;-- 获取ID范围SELECTMIN(id),MAX(id)INTO min_id, max_id FROM mkp_trade;SET current_id = min_id;-- 添加循环标签
migration_loop: WHILE current_id <= max_id DO-- 检查当前ID是否存在SELECTMIN(id)INTO next_id FROM mkp_trade WHERE id >= current_id LIMIT1;IF next_id ISNULLTHEN-- 使用标签退出循环LEAVE migration_loop;ENDIF;-- 设置实际要查询的ID范围SET current_id = next_id;SET@end_id= LEAST(current_id + batch_size -1, max_id);-- 插入数据INSERTINTO mkp_trade_range
SELECT*FROM mkp_trade
WHERE id BETWEEN current_id AND@end_id;-- 获取实际插入的行数SET rows_affected = ROW_COUNT();IF rows_affected =0THEN-- 没有插入数据,直接跳到下一批SET current_id =@end_id+1;ELSE-- 成功插入数据,更新current_idSET current_id =@end_id+1;ENDIF;-- 每批提交后暂停0.1秒(减少负载)DO SLEEP(0.1);ENDWHILE migration_loop;COMMIT;END;
拷贝原始表数据到分区表
INSERTINTO partitioned_table (id, order_date, amount)SELECT id, order_date, amount FROM original_table;