Я начну с чего-то из MySQL Online Ограничения DDL:
Нет механизма приостановки операции DDL в режиме онлайн или дросселирования ввода-вывода или использования ЦП для онлайн-операции DDL.
Однако меня все еще интересуют решения, которые я, возможно, пропустил.
Ситуация: индексы становятся все больше и больше, и они становятся настолько большими, что не будет достаточно памяти для используемых запросов, что приведет к ускорению ввода-вывода диска, и все, чтобы спуститься в полный хаос, Созданы новые составные индексы, которые меньше, но проблема заключается в запуске ALTER TABLE
без нарушения.
Факты заключаются в следующем:
- Это таблица InnoDB.
- В таблице нет первичного ключа или уникального индекса.
- Никакая комбинация столбцов не подходит в качестве первичного ключа или уникального индекса.
- В таблице нет внешних ключей.
- Таблица разбивается на месяц (в настоящее время 50).
- Таблица должна принимать записи в любое время.
- Новые разделы 3-6 должны принимать сообщения.
- Существует столбец
id
, но это не уникально. - Таблица состоит из приблизительно 2 миллиардов строк.
- Разделение текущего месяца является единственным, который получает записи.
- Перегородки производятся за 1 месяц; всегда есть один пустой раздел.
SHOW CREATE TABLE
(я не включил все разделы):
CREATE TABLE `my_wonky_table` (
`id` bigint(20) unsigned NOT NULL,
`login` varchar(127) DEFAULT NULL,
`timestamp` int(10) unsigned NOT NULL,
`ip` varchar(32) CHARACTER SET ascii DEFAULT NULL,
`val_1` int(10) unsigned DEFAULT NULL,
`val_2` varchar(127) DEFAULT NULL,
`val_3` varchar(255) DEFAULT NULL,
`val_4` varchar(127) DEFAULT NULL,
`val_5` int(10) unsigned DEFAULT NULL,
KEY `my_wonky_table_id_idx` (`id`),
KEY `my_wonky_table_timestamp_idx` (`timestamp`),
KEY `my_wonky_table_val_1_idx` (`val_1`,`id`),
KEY `my_wonky_table_val_2_idx` (`val_2`,`id`),
KEY `my_wonky_table_val_4_idx` (`val_4`,`id`),
KEY `my_wonky_table_val_5_idx` (`val_5`,`id`),
KEY `my_wonky_table_ip_idx` (`ip`,`id`),
KEY `my_wonky_table_login_idx` (`login`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (`id`)
(PARTITION pdefault VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
Относительно запросов: всегда SELECT
на id
, причем все, что используется для фильтрации.
Чего я бы хотел избежать:
- Отключение экземпляра базы данных.
- Дисковый ввод-вывод 100%
Я подумал об использовании инструмента pt-online-schema-change
для дросселирования, но столкнулся с отсутствием стены основного ключа. Другим решением было бы сделать это в коде, эффективно перемещая триггеры на базу кода и медленно копируя данные с использованием нескольких странных фрагментов (например, кусков данных с часами, используя столбец временной метки), потому что нет уникального индекса.
Существуют ли другие решения и/или инструменты?