概要 :このチュートリアルでは、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','[email protected]');
Code language: SQL (Structured Query Language) (sql)
試してみてください
次に、重複するメールを含む別の行を挿入します。
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
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','[email protected]'),
('Lisa','Smith','[email protected]');
Code language: SQL (Structured Query Language) (sql)
試してみてください
contacts
からデータをクエリする場合 特定の電子メールに基づくテーブルの場合、SQLiteはインデックスを使用してデータを検索します。次のステートメントを参照してください:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
試してみてください
SQLiteがインデックスを使用しているかどうかを確認するには、EXPLAIN QUERY PLAN
を使用します。 次のようなステートメント:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
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インデックスと、インデックスを利用してクエリのパフォーマンスを向上させたり、一意の制約を適用したりする方法について学習しました。