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


243

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

回答:


294

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


5
主キーが常にインデックス化されている場合、データベースアーキテクチャ/パフォーマンスについて話すとき、なぜSQLの初心者に「データベースが適切にインデックス化されていることを確認する」ようにアドバイスするのですか?
ティムピーターソン2013年

35
@tim:フィルタリング、グループ化、または並べ替えに使用される他の列にもインデックスがあることを確認するように人々に伝えています。
Emil H

15
参加も忘れずに!インデックス付き結合フィールドにより、処理速度が向上します。
JustJohn 2016年

31

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


1
質問する前に、検索してそのリンクを見つけました。しかし、それは私にとってこの質問についてそれまたは他の何かを暗示するようには思えません。
Alex Miller、

この回答でリンクされているページは、主キーがインデックスでもあるかどうかについては何も言っていないようです。@fyryeからの回答でリンクされているページがより関連性があります。
ジョージホーキンス

16

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

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

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

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


11

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


9

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


8

これが答えだと思います

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

インデックスは、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つのインデックスを作成することになります。


0

主キー列は、主キーの制約がもたらす他のインデックス付き列と考えることができます。

ほとんどの使用例では、テーブルの主キーとインデックス付きの列/列の両方が必要です。テーブルへのクエリは、主キーではない列/列に基づいて行をフィルターする場合があるため、通常、これらの列/列にインデックスを付けます。同じように。

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