簡體   English   中英

MySQL 是否自動索引外鍵列?

[英]Does MySQL index foreign key columns automatically?

MySQL 是否自動索引外鍵列?

是的,但僅限於 Innodb 是目前唯一實現了外鍵的表格式。

顯然,索引是按照robert 發布的鏈接中指定的自動創建的。

InnoDB 需要外鍵和引用鍵的索引,以便外鍵檢查可以快速並且不需要表掃描。 在引用表中,必須有一個索引,其中外鍵列以相同的順序列為第一列。 如果引用表不存在,則會在引用表上自動創建此類索引。 (這與某些舊版本形成對比,在這些舊版本中必須顯式創建索引,否則外鍵約束的創建將失敗。) index_name,如果給定,則如前所述使用。

InnoDB 和 FOREIGN KEY 約束

是的,請參閱InnoDB 和 FOREIGN KEY 約束

如果您執行 ALTER TABLE(而不是 CREATE TABLE),則不會自動獲取索引,至少根據文檔(鏈接適用於 5.1,但與 5.5 相同):

[...] 當您使用 ALTER TABLE 向表添加外鍵約束時,請記住首先創建所需的索引。

對於那些從5.7 文檔中尋找報價的人:

MySQL 需要外鍵和引用鍵的索引,以便外鍵檢查可以快速並且不需要表掃描。 在引用表中,必須有一個索引,其中外鍵列以相同的順序列為第一列。 如果引用表不存在,則會在引用表上自動創建此類索引。 如果您創建另一個可用於強制執行外鍵約束的索引,則此索引可能會在稍后被悄悄刪除。 index_name,如果給定,則按前面所述使用。

如前所述,它適用於 InnoDB。 起初我覺得很奇怪許多其他(特別是 MS SQL 和 DB2)沒有。 只有當表行很少時,表空間掃描才比索引掃描更好 - 因此對於絕大多數情況,外鍵都希望被索引。 然后它有點打擊我 - 這並不一定意味着它必須是一個獨立的(一列)索引 - 它在 MySQL 的自動 FK 索引中。 所以,這可能是 MS SQL、DB2(我不確定是否使用 Oracle)等將它留給 DBA 的原因; 畢竟大表上的多個索引會導致性能和空間問題。

是的, Innodb提供了這個。 您可以在FOREIGN KEY子句之后放置一個外鍵名稱,或者留下它讓 MySQL 為您創建一個名稱。 MySQL 會自動創建一個帶有foreign_key_name名稱的索引。

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

是的,當您創建一個具有指向另一個表的外鍵的表時,Mysql 會自動索引外鍵。

無法自動獲取索引鍵使用

ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)

您創建的表的名稱(例如照片)和 FOREIGN KEY(例如photograph_id 代碼應該是這樣的

ALTER TABLE photographs ADD INDEX (photograph_id);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM