SQLiteテーブルで整数列が主キーとしてマークされている場合、その列に対してもインデックスを明示的に作成する必要がありますか?SQLiteは主キー列のインデックスを自動的に作成するようには見えませんが、目的に応じておそらくインデックスを作成しますか?(私は常にその列を検索します)。
文字列の主キーの場合、状況は異なりますか?
SQLiteテーブルで整数列が主キーとしてマークされている場合、その列に対してもインデックスを明示的に作成する必要がありますか?SQLiteは主キー列のインデックスを自動的に作成するようには見えませんが、目的に応じておそらくインデックスを作成しますか?(私は常にその列を検索します)。
文字列の主キーの場合、状況は異なりますか?
回答:
INTEGER PRIMARY KEY列は別として、UNIQUE制約とPRIMARY KEY制約の両方は、データベースにインデックスを作成することによって実装されます( "CREATE UNIQUE INDEX"ステートメントと同じ方法で)。このようなインデックスは、データベース内の他のインデックスと同様に、クエリを最適化するために使用されます。その結果、すでに集合的にUNIQUEまたはPRIMARY KEY制約の対象となっている列のセットにインデックスを作成しても、多くの場合、利点はありません(ただし、かなりのオーバーヘッドがあります)。
sqlite_master
表で名前がで始まることを示していsqlite_autoindex_
ます。
UNIQUE
UNIQUE
列がINTEGER PRIMARY KEYとマークされている場合、実際には、他のPRIMARY KEYまたはインデックス付きの値を指定して行った同様の検索の約2倍の速度です。それの訳は:
... SQLiteテーブル内のすべての行には、テーブル内の行を一意に識別する64ビットの符号付き整数キーがあります...特定の行IDを持つレコード、または指定した範囲内の行IDを持つすべてのレコードの検索は、他の任意の主キーまたはインデックス付きの値を指定することによって行われる同様の検索と同じくらい高速です。
以下に示す1つの例外を除き、ROWIDテーブルに単一の列で構成される主キーがあり、その列の宣言された型が大文字と小文字が混在する「INTEGER」である場合、列はROWIDのエイリアスになります。
このような列は通常、「整数主キー」と呼ばれます。PRIMARY KEY列は、宣言された型名が正確に「INTEGER」である場合にのみ、整数の主キーになります。「INT」、「BIGINT」、「SHORT INTEGER」、「UNSIGNED INTEGER」などの他の整数型名は、主キー列が、ROWIDのエイリアスとしてではなく、整数親和性と一意のインデックスを持つ通常のテーブル列として動作します。