Aev*_*eus 10 mysql database indexing alter-table
我将从MySQL 在线DDL限制页面开始:
没有机制可以暂停联机DDL操作或限制联机DDL操作的I/O或CPU使用率.
但是,我仍然对我可能错过的解决方案感兴趣.
情况:索引越来越大,而且它们变得越来越大,以至于没有足够的内存用于所使用的查询,导致磁盘I/O飙升,一切都陷入混乱.已经创建了较小的新复合索引,但问题是在ALTER TABLE
不破坏任何内容的情况下运行.
事实如下:
id
列,但这不是唯一的.在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) */
Run Code Online (Sandbox Code Playgroud)
关于查询:它总是SELECT
打开id
,其他一切都用于过滤.
我想避免的:
我曾想过用这个pt-online-schema-change
工具来节流,但是遇到了无主键墙.一个不同的解决方案是在代码中执行此操作,有效地将触发器移动到代码库,并使用有些奇怪的块(例如,使用时间戳列的一小时数据块)慢慢地复制数据,因为没有唯一索引.
是否有其他解决方案和/或工具可用?
new
类似于real
表的表,但使用修改后的索引.包括一个,PRIMARY KEY
以便您不会再被困.- 这是ALTER
,但还不是"人口".new
表中.我对块的建议在这里可能有用.RENAME TABLE real TO old, new TO real;
.然后再打开.强烈建议编写所有脚本并在另一台机器上练习.实践可以是总数的一小部分,但它需要至少有几个分区.
归档时间: |
|
查看次数: |
226 次 |
最近记录: |