SQLiteの主キーにインデックスは必要ですか?


130

SQLiteテーブルで整数列が主キーとしてマークされている場合、その列に対してもインデックスを明示的に作成する必要がありますか?SQLiteは主キー列のインデックスを自動的に作成するようには見えませんが、目的に応じておそらくインデックスを作成しますか?(私は常にその列を検索します)。

文字列の主キーの場合、状況は異なりますか?

回答:


148

それはあなたのためにそれをします。

INTEGER PRIMARY KEY列は別として、UNIQUE制約とPRIMARY KEY制約の両方は、データベースにインデックスを作成することによって実装されます( "CREATE UNIQUE INDEX"ステートメントと同じ方法で)。このようなインデックスは、データベース内の他のインデックスと同様に、クエリを最適化するために使用されます。その結果、すでに集合的にUNIQUEまたはPRIMARY KEY制約の対象となっている列のセットにインデックスを作成しても、多くの場合、利点はありません(ただし、かなりのオーバーヘッドがあります)。


8
実際、「PRIMARY KEY属性は通常、PRIMARY KEYとして指定された1つまたは複数の列にUNIQUEインデックスを作成します」と述べています。ただし、そのインデックスはSQLite管理アプリケーションでは表示されないため、私は尋ねました。
MarekJedliński、2010

1
これは、sqlite_master表で名前がで始まることを示していsqlite_autoindex_ます。
dan04 2010

2
遅くなりますが、@ NicolasZozolはい、存在しない場合は、親/参照フィールドにインデックス(または制約)を作成する必要があります。子/参照フィールドにはインデックスをUNIQUEUNIQUE
付ける

2
うーん、SQL Data Constraints ここのセクション言う:ほとんどの場合、UNIQUEおよびPRIMARY KEY制約は、データベースに一意のインデックスを作成することによって実装されます。(例外は、WITHOUT ROWIDテーブルのINTEGER PRIMARY KEYおよびPRIMARY KEYです。)だから答えは常に真実ではありませんか?
遊び心のある好奇心

3
ROWIDがインデックスが、異なる実装されているように思えるsqlite.org/lang_createtable.html#rowidキー...検索などROWID値を使用して、各表の行のための1つのエントリを含むBツリー構造として格納されている行IDテーブルのデータを特定のROWIDを持つレコードの場合...他のPRIMARY KEYまたはインデックス付きの値を指定して行った同様の検索の約2倍高速です。
matreshkin

15

列がINTEGER PRIMARY KEYとマークされている場合、実際には、他のPRIMARY KEYまたはインデックス付きの値を指定して行った同様の検索の2倍の速度です。それの訳は:

... SQLiteテーブル内のすべての行には、テーブル内の行を一意に識別する64ビットの符号付き整数キーがあります...特定の行IDを持つレコード、または指定した範囲内の行IDを持つすべてのレコードの検索は、他の任意の主キーまたはインデックス付きの値を指定することによって行われる同様の検索と同じくらい高速です。

以下に示す1つの例外を除き、ROWIDテーブルに単一の列構成される主キーがあり、その列の宣言された型が大文字と小文字が混在する「INTEGER」である場合、列はROWIDのエイリアスになります。

このような列は通常、「整数主キー」と呼ばれます。PRIMARY KEY列は、宣言された型名が正確に「INTEGER」である場合にのみ、整数の主キーになります。「INT」、「BIGINT」、「SHORT INTEGER」、「UNSIGNED INTEGER」などの他の整数型名は、主キー列が、ROWIDのエイリアスとしてではなく、整数親和性と一意のインデックスを持つ通常のテーブル列として動作します。

参照:http : //www.sqlite.org/lang_createtable.html#rowid


8

データベースは常に一意の主キーのインデックスをサイレントに作成するため、効率的に一意であることを内部的にチェックできます。

作成した後、必要なときに使用します。

もちろん、常にクラスター化されるわけではなく、通常はスキーマに指定します。

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