繁体   English   中英

MySQL-“一对多”关系的“许多”方面的聚集索引

[英]MySQL - clustered index on the “many” side of a “one to many” relationship

我相信这对你们很多人来说都是简单的事情,因此希望您能轻松地提供帮助。

如果我在“一对多”关系的“许多”侧具有MySQL表-像这样:

Create Table MyTable(
ThisTableId int auto_increment not null,
ForeignKey int not null,
Information text
)

由于此表将始终通过使用ForeignKey的联接来使用,因此使ForeignKey成为聚簇索引似乎很有用,这样对于同一源记录,外键将始终被相邻排序。 但是,ForeignKey不是唯一的,因此我认为将其作为聚集索引是不可能还是不好的做法? 如果尝试使用(ForeignKey,ThisTableId)制作复合主键以实现有用的聚类和唯一性,则会出现错误“只能有一个自动列,必须将其定义为键”。

我认为也许我处理方法不正确,在这种情况下,为上表建立索引以获取最大速度的最佳方法是什么?

InnoDB要求,如果您有一个自动增量列,它必须是键中的第一列。

因此,如果ThisTableId是自动递增的,则不能将主键定义为(ForeignKey,ThisTableId)。

如果ThisTableId只是常规列(不是自动递增),则可以执行此操作,但是您将负责分配在ForeignKey中具有相同值的其他行中至少唯一的值。

我见过的一种方法是使列BIGINT UNSIGNED,并使用BEFORE INSERT触发器从函数UUID_SHORT()中为该列分配一个值。


@ypercube正确地指出了另一种解决方案:InnoDB规则是,自动递增列应为某个键的第一列,如果创建普通的辅助键,就足够了。 这使您可以创建如下表:

CREATE TABLE `MyTable` (
  `ForeignKey` int(11) NOT NULL,
  `ThisTableId` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ForeignKey`,`ThisTableId`),
  KEY (`ThisTableId`)
) ENGINE=InnoDB;

并且自动增量按预期工作:

mysql> INSERT INTO MyTable (ForeignKey) VALUES (123), (234), (345), (456);

mysql> select * from MyTable;
+------------+-------------+
| ForeignKey | ThisTableId |
+------------+-------------+
|        123 |           1 |
|        234 |           2 |
|        345 |           3 |
|        456 |           4 |
+------------+-------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM