更改分区表



我在网上找不到有关这方面的信息。

更改已分区表的最佳方法是什么?

我应该只使用正常的

UPDATE `table` MODIFY COLUMN `column_name` TINYINT(1) DEFAULT 1 NOT NULL;

并锁定桌子几分钟

还是我应该逐个分区运行该命令?

UPDATE `table` PARTITION (p0) MODIFY COLUMN `column_name` TINYINT(1) DEFAULT 1 NOT NULL;

你有什么建议? 如果不是所有分区都完全相同,会发生什么情况?这可能吗?

这是创建语句:

CREATE TABLE `redirects` (
`emailhash` varchar(100) NOT NULL,
`f_email_log` varchar(50) NOT NULL,
`linknum` int(11) NOT NULL DEFAULT '1',
`redirect` varchar(500) NOT NULL,
`clicked` int(11) NOT NULL DEFAULT '0',
`clicktime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`emailhash`),
KEY `f_email_log` (`f_email_log`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY (emailhash)
PARTITIONS 16 */

该表有大约 4000 万条记录。

我想减小一些字段的大小,例如 INT 到 TINYINT,因为这些值大多是 1-30 或 0/1,以及 varchar 长度,因为我发现这些数字太大并且可以减少。

更改分区表需要一次更改一个分区。 同时,需要锁定整个表,否则,读/写将绊倒半成品的 Alter。

请提供SHOW CREATE TABLE、分区数、分区的理由,并指出需要更改的列。 我们也许可以提出一个解决方法。

更多

对于该架构,400M 行大约是 12GB?
4GB buffer_pool(对于这么多 RAM 可以提高到 11G(
md5
用于密钥 -> 67% 的插入和选择不会在 RAM(缓存(中找到所需的块,因此必须击中磁盘。 这会导致性能低迷。 随着桌子的增长,情况只会变得更糟。 它是否分区并不重要。 (不,我无法解释您报告的差异。

有关更多讨论,请参阅此处,但对于您的用例没有好的解决方案。

缩小数据类型(4 字节INT--> 1 字节TINYINT UNSIGNED等(会有所帮助。UNHEX(md5)会让你把哈希值放在 16 个字节中:BINARY(16),从而比现在节省大约 18 个字节。 缩小VARCHAR的最大值几乎没有影响。 同上CHARACTER SET.

查询需要where emailhash=UNHEX('abcdef1234567890')

改变

回到如何"快速"进行 ALTER 的原始问题。 除非您已经设置了复制,否则您大多不走运。 分区必须始终具有相同的架构,因此您不可能逐个更改它们。

但。。。检查pt-online-schema-changegh-ost以查看它们是否适用于分区表。

最新更新