我无法在网上找到有关此信息。
更改已分区的表的最佳方法是什么?
我应该使用正常的
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长度,因为我发现这些数字太大而且可以减少。
答案 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
,看看它们是否适用于分区表。