更改分区表
我在网上找不到关于此的信息。更改分区表
改变已分区表的最佳方法是什么?
我应该只是使用普通
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长度,因为我发现这些数字太大,可以是降低。
更改分区表需要每次更改一个分区。与此同时,整个表需要被锁定,否则,读/写会在一半的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-change
和gh-ost
以查看它们是否可以使用分区表。
我已将代码添加到原始问题中。任何想法? –
'PARTITION BY KEY(the-primary-key)'对性能无用。你希望通过分区获得什么?另外,16分区表大约有100MB的开销。 –
假设“哈希”是非常随机的,你一直在桌子上跳来跳去。我假设你没有足够的内存来缓存整个表格?因此表现会受到影响。 –