web-dev-qa-db-ja.com

MySQLは外部キー列に自動的にインデックスを付けますか?

MySQLは外部キー列に自動的にインデックスを付けますか?

227
Dónal

はい、ただし innodb のみ。 Innodbは現在、外部キーが実装されている唯一の出荷されたテーブル形式です。

198
Grant Limberg

どうやら リンクロバートが投稿しました で指定されているように、インデックスが自動的に作成されます。

InnoDBでは、外部キーのチェックが高速になり、テーブルスキャンが不要になるように、外部キーと参照キーのインデックスが必要です。参照元テーブルには、外部キー列が同じ順序で最初の列としてリストされているインデックスが必要です。 このようなインデックスは、参照元のテーブルに存在しない場合は自動的に作成されます。(これは、インデックスを作成する必要があった古いバージョンとは対照的です明示的に作成しないと、外部キー制約の作成に失敗します。)index_nameが指定されている場合は、前述のように使用されます。

InnoDBおよび外部キーの制約

117
Mr Alexander

はい、 InnoDBおよび外部キー制約 を参照してください。

21
Robert Gamble

少なくとも ドキュメント に従ってALTER TABLE(CREATE TABLEの代わりに)を実行する場合、インデックスは自動的に取得されません(リンクは5.1用ですが、5.5でも同じです)。

[...] ALTER TABLEを使用して外部キー制約をテーブルに追加する場合、必要なインデックスを最初に作成することを忘れないでください。

11

述べたように、InnoDBでも同様です。最初は、他の多くの(特にMS SQLとDB2)がそうでないのは奇妙だと思いました。 TableSpaceスキャンは、テーブル行が非常に少ない場合にのみインデックススキャンよりも優れているため、ほとんどの場合、外部キーにインデックスを作成する必要があります。それはちょっと私を襲った-これは必ずしもそれがスタンドアロン(1列)インデックスでなければならないという意味ではない-それはMySQLの自動FKインデックスにあります。だから、それがMS SQL、DB2(Oracleではわかりません)などがDBAに任せる理由かもしれません。大きなテーブル上のすべての複数のインデックスは、パフォーマンスとスペースの問題を引き起こす可能性があります。

4
Wolf5370

5.7からの引用を探している人のために docs

MySQLは、外部キーのチェックが高速で、テーブルスキャンを必要としないように、外部キーと参照キーのインデックスを必要とします。参照元テーブルには、外部キー列が同じ順序で最初の列としてリストされているインデックスが必要です。このようなインデックスは、参照元テーブルに存在しない場合は自動的に作成されます。外部キー制約を強制するために使用できる別のインデックスを作成すると、このインデックスは後で静かに削除される場合があります。 index_nameが指定されている場合、前述のように使用されます。

4
Fahmi

はい、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
2
Navrattan Yadav