2

我在网上找不到关于此的信息。更改分区表

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

我应该只是使用普通

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语句:

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 */ 

表有大约40万条记录。

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

回答

1

更改分区表需要每次更改一个分区。与此同时,整个表需要被锁定,否则,读/写会在一半的Alter上绊倒。

请提供SHOW CREATE TABLE,分区数量,分区原理,并指出哪一列需要更改。我们可能会提出一个解决方法。

400M行会约12GB为架构?
4GB BUFFER_POOL(其可提高到11G为多RAM)
MD5关键
- 插入和选择的> 67%将找不到在RAM(高速缓存)的所需块,所以必须打磁盘。这导致表现不佳。随着桌子的增长,它只会变得更糟。它是否被分割也不重要。 (否,我无法解释您报告的差异。)

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

缩小数据类型(4字节INT - > 1字节TINYINT UNSIGNED等)将有所帮助。 UNHEX(md5)会让你把这个散列放在16个字节里:BINARY(16),从而节省了你现在拥有的18个字节的东西。收缩最大VARCHAR几乎没有或没有影响。同上CHARACTER SET

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

ALTER

回怎么办ALTER “快” 了原来的问题。除非你的已经有有复制设置,否则你大多运气不好。分区必须始终具有相同的模式,因此您无法一个一个地改变它们。

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

+0

我已将代码添加到原始问题中。任何想法? –

+0

'PARTITION BY KEY(the-primary-key)'对性能无用。你希望通过分区获得什么?另外,16分区表大约有100MB的开销。 –

+0

假设“哈希”是非常随机的,你一直在桌子上跳来跳去。我假设你没有足够的内存来缓存整个表格?因此表现会受到影响。 –