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


回答:


229

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


1
MySQLが他のテーブルタイプの非インデックスカラムで外部キーを許可することを信じる理由はありますか?
Robert Gamble

本当に答えられませんでした。MySQL 6.0でリリースされるMariaおよびFalconストレージエンジンを調べて、インデックス付けされていない列で外部キーをサポートしているかどうかを確認することができます。
Grant Limberg、

どうやらこれは真実ではありません。大きなテーブル(100万レコード)とcount(*)があり、fkey =?15秒かかります。fkey列にインデックスを追加しました。これで1秒未満になりました。
AbiusX 2016

別のテーブルと1000万件のレコードを使用した同じ実験。これはしばしばMySQL 5.1 InnoDBです。テーブルには3つのフィールドがあり、1つは主キー整数で、もう1つはすでにインデックスが付けられています。3番目は、別のテーブルの主キーへの外部キーでした。明示的なインデックスを追加しない場合、ここではルックアップに数秒かかりました。テーブルのインデックスを表示しても、インデックスは表示されませんでした。
AbiusX 2016

@AbiusX 5.1はおそらく古すぎます。以下のMrAlexanderの回答を参照してください。
e2-e4

131

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

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

InnoDBとFOREIGN KEYの制約


9
+1は、ドキュメントからの証拠を提供するために選択されたものよりもはるかに良い回答
Gaz_Edge 2014年

6
引用されたテキストはMySQLのドキュメントに含まれていないようで、これがまだ正しいかどうかは不明です。
コートニーマイル

7
@ user2045006あなたはを参照することができDOC 5.0井戸としてDOC 5.6正確に引用されたテキストのために
sactiw

1
:現在のドキュメントでは、テキスト中のちょうどわずかな変化(私は意味が似ていると仮定)があるInnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
ルーカスBasquerottoは


11

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

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


2
また、MySQL 5.6とMariaDB 10を試し、ALTER TABLEがインデックスを作成しました。興味深いのは、mysqlindexcheckがそのインデックスを「冗長インデックス」として報告したことです。削除しようとしましたが、「エラー1553(HY000):インデックス 'index_name'を削除できません:外部キー制約で必要です」というエラーが発生しました。したがって、そのインデックスを削除して外部キーを保持することはできません。
Ciprian Stoica、

回答を修正することもできます。MySQL は、インデックスがまだ存在しない場合常に外部キーチェックを高速化するためにインデックスを作成します。ドキュメントは、外部キー制約の前にインデックスを作成すると、処理が少し速くなる可能性があることを伝えようとしています。たとえば、外部キーチェックのインデックスとして機能できる複合キーインデックスは、冗長インデックスを自動生成する代わりに、InnoDBで使用できます。
BMiner

7

5.7 ドキュメントからの引用を探している人のために:

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


4

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


複合キーインデックスについて良い点を挙げます。ただし、新しく作成された複合キーインデックスが外部キーチェックを高速化する義務を満たしている場合、MySQLは自動生成された単一キーインデックスを自動的またはサイレントに削除します。正直なところ、MS SQLやDB2などがなぜこれを行わないのか、私にはわかりません。彼らには言い訳がほとんどありません。外部キーで自動生成されたインデックスが有害なユースケースは考えられません。
BMiner

2

はい、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

0

はい、Mysqlは、別のテーブルへの外部キーを持つテーブルを作成すると、外部キーを自動的にインデックス化します。


-2

インデックスキーを自動的に取得することはできません

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

たとえば、写真やFOREIGN KEYなど、作成したテーブルの名前photograph_id。コードはこのようにする必要があります

ALTER TABLE photographs ADD INDEX (photograph_id);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.