我有一个非常大的MySQL表,我想对其进行分区。此表的简化创建如下所示-
CREATE TABLE `myTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`columnA` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`columnB` varchar(50) NOT NULL ,
`columnC` int(11) DEFAULT NULL,
`columnD` varchar(255) DEFAULT NULL,
`columnE` int(11) DEFAULT NULL,
`columnF` varchar(255) DEFAULT NULL,
`columnG` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_B` (`columnB`),
UNIQUE KEY `UNIQ_B_C` (`columnB`,`columnC`),
UNIQUE KEY `UNIQ_C_D` (`columnC`,`columnD`),
UNIQUE KEY `UNIQ_E_F_G` (`columnE`,`columnF`,`columnG`)
)我想用columnA或id来划分我的表,但问题是MySQL手册指出-
换句话说,表中的每个唯一键都必须使用表的分区表达式中的每一列。
这意味着,如果不更改我的架构,我就不能在这些列上对表进行分区。例如,我考虑将id添加到我所有的唯一键中,比如-
CREATE TABLE `myTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`columnA` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`columnB` varchar(50) NOT NULL ,
`columnC` int(11) DEFAULT NULL,
`columnD` varchar(255) DEFAULT NULL,
`columnE` int(11) DEFAULT NULL,
`columnF` varchar(255) DEFAULT NULL,
`columnG` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_B` (`columnB`,`id`),
UNIQUE KEY `UNIQ_B_C` (`columnB`,`columnC`,`id`),
UNIQUE KEY `UNIQ_C_D` (`columnC`,`columnD`,`id`),
UNIQUE KEY `UNIQ_E_F_G` (`columnE`,`columnF`,`columnG`,`id`)
)除了允许创建不应该创建的行之外,我不介意这样做。例如,根据我的原始模式,下面的行插入不会工作两次-
INSERT into myTable (columnC, columnD) VALUES (1.0,2.0)但是它与第二个模式一起工作,因为columnC和columnD本身不再形成唯一的键。我已经考虑过通过使用触发器来防止此类行的创建,但是触发器成本会降低(或超过)分区性能增益。
编辑:
关于本表的一些补充信息:
除了分区之外,我们还有哪些选项可以在不丢失任何数据和维护完整性约束的情况下提高表的性能。
发布于 2017-07-26 12:34:59
如何对包含几个唯一键的MySQL表进行分区?
抱歉地说,你没有。
此外,您也不应该这样做。请记住,对具有唯一键的表的UPDATE和INSERT操作必须查询表,以确保键保持惟一。如果可以对表进行分区,这样就不会将唯一的键内置到partition表达式中,那么每次插入或更新都需要查询每个分区。这可能会使分区变得比无用更糟糕。
https://stackoverflow.com/questions/45325849
复制相似问题