首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对包含几个唯一键的MySQL表进行分区?

如何对包含几个唯一键的MySQL表进行分区?
EN

Stack Overflow用户
提问于 2017-07-26 11:38:24
回答 1查看 457关注 0票数 2

我有一个非常大的MySQL表,我想对其进行分区。此表的简化创建如下所示-

代码语言:javascript
复制
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添加到我所有的唯一键中,比如-

代码语言:javascript
复制
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`)
  )

除了允许创建不应该创建的行之外,我不介意这样做。例如,根据我的原始模式,下面的行插入不会工作两次-

代码语言:javascript
复制
  INSERT into myTable (columnC, columnD) VALUES (1.0,2.0)

但是它与第二个模式一起工作,因为columnC和columnD本身不再形成唯一的键。我已经考虑过通过使用触发器来防止此类行的创建,但是触发器成本会降低(或超过)分区性能增益。

编辑:

关于本表的一些补充信息:

  1. 表中有超过12亿的记录。
  2. 使用MySQL5.6.34版本和InnoDB引擎,并在AWS上运行。
  3. 这个表上也没有其他索引。
  4. 由于大量的数据和多个索引,因此插入和检索数据是一个昂贵的过程。
  5. 在时间戳和浮动数据类型上没有唯一的索引。它只是一个用于说明的示例表模式。我们的实际表具有与上面的表类似的模式.

除了分区之外,我们还有哪些选项可以在不丢失任何数据和维护完整性约束的情况下提高表的性能。

EN

回答 1

Stack Overflow用户

发布于 2017-07-26 12:34:59

如何对包含几个唯一键的MySQL表进行分区?

抱歉地说,你没有。

此外,您也不应该这样做。请记住,对具有唯一键的表的UPDATEINSERT操作必须查询表,以确保键保持惟一。如果可以对表进行分区,这样就不会将唯一的键内置到partition表达式中,那么每次插入或更新都需要查询每个分区。这可能会使分区变得比无用更糟糕。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45325849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档