web-dev-qa-db-ja.com

主キーはMySQLで自動的にインデックス付けされますか?

明示的にインデックスを作成する必要がありますか、それとも主キーを定義するときに暗黙的に作成されますか? MyISAMとInnoDBの答えは同じですか?

233
Alex Miller

主キーには常にインデックスが付けられます。これはMyISAMとInnoDBで同じであり、一般的にインデックスをサポートするすべてのストレージエンジンに当てはまります。

277
Emil H

http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html によれば、これは暗黙的であるように見えます

30
PSU_Kardi

これは2009年に求められたものの、主キーに関するMySQLドキュメントへの実際の参照を投稿すると思いました。 http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

テーブルのprimary keyは、最も重要なクエリで使用する列または列のセットを表します。 クエリのパフォーマンスを高速化するために、関連付けられたインデックスがあります

MySQL 5.0のリファレンスについては、以下を参照してください: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

ほとんどのMySQLindexesPRIMARY KEY、UNIQUE、INDEX、およびFULLTEXT) Bツリーに格納されます。例外は、空間データ型のインデックスはRツリーを使用し、MEMORYテーブルもハッシュインデックスをサポートすることです。

15
fyrye

主キーは、MyISAMとInnoDBの両方に対して暗黙的にインデックス付けされます。これを確認するには、主キーを使用するクエリでEXPLAINを使用します。

10
Patrick Gryciuk

主キーのインデックスを明示的に作成する必要はありません...デフォルトで行われます。

8
Rick

これが答えだと思う

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)
7
guest

インデックスは、where句で頻繁に使用される列や、 "order by"などのあらゆる種類の並べ替えで使用するのが最適です。より複雑なデータベースで作業している可能性があるため、いくつかの単純なルールを覚えておくことをお勧めします。

  • インデックスは挿入と更新を遅くするため、頻繁に更新される列では慎重に使用する必要があります。
  • インデックスはwhere句と順序付けを高速化します。テーブルを構築するときに、データがどのように使用されるかについて考えることを忘れないでください。他にも覚えておくべきことがいくつかあります。テーブルが非常に小さい場合、つまり数人の従業員しかいない場合、インデックスを使用してテーブルスキャンを実行するよりも、インデックスを使用する方が悪いでしょう。

  • インデックスは、多くの行があるテーブルでのみ有効です。

  • 覚えておくべきもう1つのことは、従業員のデータベースの状況における短所ですが、列が可変長の場合、インデックス(およびほとんどのMySQL)のパフォーマンスが大幅に低下することです。

  • 参加も忘れないでください!インデックス付き結合フィールドは速度を上げます。

4

主キーは常に自動的にインデックス付けされ、一意です。したがって、冗長なインデックスを作成しないように注意してください。

たとえば、テーブルを次のように作成した場合

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

主キーにインデックスを作成し、一意性制約を適用するため、実際にはfoo!に3つのインデックスを作成することになります。

1
dr01