更改分区表

时间:2017-08-18 18:57:49

标签: mysql database-performance partition database-partitioning

我无法在网上找到有关此信息。

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

我应该使用正常的

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

该表有大约4千万条记录。

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

1 个答案:

答案 0 :(得分:1)

更改分区表需要一次更改一个分区。同时,需要锁定整个表,否则,读/写将会在半完成的Alter上发现。

请提供function getSession(key, cb){ socket.emit('client_get_session', {key : key}); socket.on('server_send_session', function(data) { if(!data) return console.error('beep error occured'); cb && cb(data); }); } getSession(123,function(resData){ console.log('result',resData); }) ,分区数,分区的基本原理,并指出哪些列需要更改。我们或许可以建议解决方法。

更多

该架构的400M行约为12GB? 4GB buffer_pool(对于那么多RAM,可以提升到11G)
md5为钥匙
- > 67%的插入和选择将无法在RAM(缓存)中找到所需的块,因此必须访问磁盘。这导致表现迟缓。随着桌子的增长,它只会变得更糟。它是否被分区并不重要。 (不,我无法解释你报告的差异。)

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

缩小数据类型(4字节SHOW CREATE TABLE - > 1字节INT等)将有所帮助。 TINYINT UNSIGNED允许你将哈希值放在16个字节中:UNHEX(md5),从而节省了18个字节以上的内容。缩小BINARY(16)上的最大值几乎没有影响。同上VARCHAR

查询需要CHARACTER SET

<强> ALTER

回到如何做“快”的ALTER的原始问题。除非你已经设置了复制,否则你运气不好。分区必须始终具有相同的模式,因此您无法逐个更改它们。

但是......检查where emailhash=UNHEX('abcdef1234567890')pt-online-schema-change,看看它们是否适用于分区表。