MySQL は外部キー列に自動的にインデックスを付けますか?
8 に答える
はい、ただしinnodbのみです。Innodb は現在、外部キーが実装されている唯一の出荷済みテーブル形式です。
どうやら、ロバートが投稿したリンクで指定されているように、インデックスが自動的に作成されます。
InnoDBでは、外部キーと参照キーのインデックスが必要です。これにより、外部キーのチェックが高速になり、テーブルスキャンが不要になります。参照テーブルには、外部キー列が同じ順序で最初の列としてリストされているインデックスが必要です。このようなインデックスは、参照テーブルが存在しない場合は自動的に作成されます。(これは、インデックスを明示的に作成する必要があった、または外部キー制約の作成が失敗する一部の古いバージョンとは対照的です。)index_nameが指定されている場合は、前述のように使用されます。
はい、InnoDB および FOREIGN KEY Constraintsを参照してください。
少なくともドキュメントによると、(CREATE TABLE の代わりに) ALTER TABLE を実行すると、インデックスは自動的に取得されません(リンクは 5.1 用ですが、5.5 でも同じです):
[...] ALTER TABLE を使用してテーブルに外部キー制約を追加するときは、最初に必要なインデックスを作成することを忘れないでください。
述べたように、InnoDBの場合です。最初は、他の多く (特に MS SQL と DB2) がそうでないのは奇妙だと思いました。TableSpace スキャンは、テーブルの行が非常に少ない場合にのみインデックス スキャンよりも優れています。そのため、ほとんどの場合、外部キーにインデックスを付ける必要があります。次に、それは私を襲いました-これは、必ずしもスタンドアロン(1列)のインデックスでなければならないという意味ではありません-MySQLの自動FKインデックスにあります。それで、それがMS SQL、DB2(Oracleはよくわかりません)などがDBAに任せる理由かもしれません。大きなテーブルに複数のインデックスを作成すると、パフォーマンスとスペースの問題が発生する可能性があります。
インデックスキーを自動的に取得することはできません
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
たとえば写真や FOREIGN KEY などを作成したテーブルの名前photograph_id
。コードは次のようになります
ALTER TABLE photographs ADD INDEX (photograph_id);