概要 :このチュートリアルでは、SQLiteインデックスを使用してデータをより高速にクエリし、並べ替え操作を高速化し、一意の制約を適用する方法を学習します。
インデックスとは何ですか?
リレーショナルデータベースでは、テーブルは行のリストです。同時に、各行はセルで構成される同じ列構造になります。各行には、行を識別するために使用される連続したROWIDシーケンス番号もあります。したがって、テーブルはペアのリストと見なすことができます:(行、行)。
テーブルとは異なり、インデックスには逆の関係があります:(row、rowid)。インデックスは、クエリのパフォーマンスを向上させるのに役立つ追加のデータ構造です。
SQLiteはインデックスの整理にBツリーを使用します。 Bに注意してください バランスのとれたの略で、Bツリーはバランスの取れたツリーであり、二分木ではありません。
Bツリーは、ツリーの両側のデータ量のバランスを保ち、行を見つけるためにトラバースする必要のあるレベルの数が常に同じおおよその数になるようにします。さらに、Bツリーインデックスで等式(=)と範囲(>、> =、<、<=)を使用したクエリは非常に効率的です。
インデックスはどのように機能しますか
各インデックスは、特定のテーブルに関連付ける必要があります。インデックスは1つ以上の列で構成されますが、インデックスのすべての列は同じテーブルに存在する必要があります。テーブルには複数のインデックスが含まれる場合があります。
インデックスを作成するたびに、SQLiteはインデックスデータを保持するためのBツリー構造を作成します。
インデックスには、インデックスで指定した列のデータと、対応するrowidが含まれます。 価値。これにより、SQLiteはインデックス付きの列の値に基づいて行をすばやく見つけることができます。
本の索引のようなデータベースの索引を想像してみてください。索引を見ることで、キーワードに基づいてページ番号をすばやく特定できます。
SQLite CREATE INDEX ステートメント
インデックスを作成するには、CREATE INDEXを使用します 次の構文のステートメント:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql) インデックスを作成するには、次の3つの重要な情報を指定します。
-
CREATE INDEXの後のインデックスの名前 キーワード。 - インデックスに属するテーブルの名前が属します。
- インデックスの列のリスト。
1つ以上の列の値がメールや電話のように一意であることを確認する場合は、UNIQUEを使用します。 CREATE INDEXのオプション 声明。 CREATE UNIQUE INDEX 新しい一意のインデックスを作成します。
SQLite UNIQUE インデックスの例
contactsという名前の新しいテーブルを作成しましょう デモンストレーション用。
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);Code language: SQL (Structured Query Language) (sql) 試してみてください
電子メールが一意であることを強制したいとします。次のように一意のインデックスを作成します。
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);Code language: SQL (Structured Query Language) (sql) 試してみてください
これをテストするには。
まず、contactsに行を挿入します テーブル。
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) 試してみてください
次に、重複するメールを含む別の行を挿入します。
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) 試してみてください
SQLiteは、一意のインデックスに違反していることを示すエラーメッセージを発行しました。 2番目の行を挿入すると、SQLiteは、電子メールがemailの行全体で一意であることを確認して確認したためです。 contactsの テーブル。
contactsにさらに2行挿入しましょう テーブル。
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','david.brown@sqlitetutorial.net'),
('Lisa','Smith','lisa.smith@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) 試してみてください
contactsからデータをクエリする場合 特定の電子メールに基づくテーブルの場合、SQLiteはインデックスを使用してデータを検索します。次のステートメントを参照してください:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) 試してみてください
SQLiteがインデックスを使用しているかどうかを確認するには、EXPLAIN QUERY PLANを使用します。 次のようなステートメント:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) 試してみてください
SQLiteマルチカラムインデックスの例
1つの列で構成されるインデックスを作成する場合、SQLiteはその列をソートキーとして使用します。複数の列を持つインデックスを作成する場合、SQLiteは追加の列を2番目、3番目、…としてソートキーとして使用します。
SQLiteは、CREATE INDEXで指定された最初の列で複数列インデックスのデータを並べ替えます 声明。次に、重複する値を2番目の列で並べ替えます。
したがって、複数列のインデックスを作成する場合、列の順序は非常に重要です。
複数列のインデックスを利用するには、クエリに、インデックスで定義されているのと同じ列の順序を持つ条件が含まれている必要があります。
次のステートメントは、first_nameに複数列のインデックスを作成します およびlast_name contactsの列 テーブル:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql) 試してみてください
contactsをクエリする場合 WHEREに次の条件のいずれかが含まれるテーブル 句、SQLiteはデータを検索するために複数列のインデックスを利用します。
1)first_nameでデータをフィルタリングする 列。
WHERE
first_name = 'John';Code language: SQL (Structured Query Language) (sql)
2)両方のfirst_nameでデータをフィルタリングする およびlast_name 列:
WHERE
first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql) ただし、次のいずれかの条件を使用すると、SQLiteは複数列のインデックスを使用しません。
1)last_nameでフィルタリングする 列のみ。
WHERE
last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)
2)first_nameでフィルタリングする またはlast_name 列。
last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql) SQLite Show Indexes
テーブルに関連付けられているすべてのインデックスを検索するには、次のコマンドを使用します。
PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)
たとえば、このステートメントには、contactsのすべてのインデックスが表示されます。 テーブル:
PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql) 出力は次のとおりです:
インデックスの列に関する情報を取得するには、次のコマンドを使用します。
PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)
この例では、インデックスidx_contacts_nameの列リストを返します。 :
データベースからすべてのインデックスを取得する別の方法は、sqlite_masterからクエリを実行することです。 テーブル:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';Code language: SQL (Structured Query Language) (sql) SQLite DROP INDEX ステートメント
データベースからインデックスを削除するには、DROP INDEXを使用します 次のようなステートメント:
DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)
この構文では、DROP INDEXの後に削除するインデックスの名前を指定します キーワード。 IF EXISTS オプションは、インデックスが存在する場合にのみインデックスを削除します。
たとえば、次のステートメントを使用して、idx_contacts_nameを削除します。 インデックス:
DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql) 試してみてください
idx_contacts_name インデックスはデータベースから完全に削除されます。
このチュートリアルでは、SQLiteインデックスと、インデックスを利用してクエリのパフォーマンスを向上させたり、一意の制約を適用したりする方法について学習しました。