簡體   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