我有一个MySQL表,有120M行,大小约120GB:
CREATE TABLE `impressions` (
`session_uuid` varchar(36) DEFAULT NULL,
`survey_uuid` varchar(255) NOT NULL,
`data` text,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`user_uuid` varchar(255) NOT NULL DEFAULT '',
`is_test` tinyint(1) NOT NULL DEFAULT '0',
KEY `impressions_survey_uuid_session_uuid_user_uuid_index` (`survey_uuid`,`session_uuid`,`user_uuid`),
KEY `impressions_created_at_index` (`created_at`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
我发现这个数据迁移需要6个多小时(在一个不错的RDS实例上,我可以运行更复杂的迁移),因为它需要进行大量的I/O操作.为什么要做这么多的手术?这里我唯一要更改的是空可选性和默认值.
ALTER TABLE `impressions` CHANGE COLUMN `user_uuid` `user_uuid` VARCHAR(255) null;