楽しいSQL 11を学びます.索引



この記事は、朴載浩のYouTube講座(リンク)を見て整理した内容の一部だ.
使用されるすべての材料およびサンプルデータは、SQLite Tutorialにおいて提供される.

1.インデックスYes


リレーショナル・データベースでは、データ量(すなわちロー数)が大きいほど、データの検索に要する時間が長くなります.
この場合、rowidなどの特殊な値を使用すると、値の位置を覚えてから値を呼び出すと、順次検索ではなく直接位置決めできるため、検索速度が速くなります.
ただし、常にrowidで検索できるわけではありません.そのため、設定したフィールドをrowidに一致させるインデックスを作成し、検索速度を速めることができます.
インデックスを生成する方法は次のとおりです.
CREATE [UNIQUE] INDEX index_name 
ON table_name(column_list);
インデックス作成時に設定したフィールドに同じ値がある場合はどうなりますか?
実習を通して了解する.
CREATE TABLE contacts (
	first_name text NOT NULL,
	last_name text NOT NULL,
	email text NOT NULL
);

CREATE UNIQUE INDEX idx_contacts_email 
ON contacts (email);

INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
テーブル、インデックスを作成し、データを挿入します.
この場合、contactsテーブルのemailフィールドはUNIQUEによって制約されません.
したがって、同じEメールアドレスを追加してもエラーは発生しません.
データを入れると

UNIQUEコンストレイントが設定されていないことによるエラーが表示されます.
sqliteでは、インデックス設定時に一意の値のみを含むカラムを設定する必要があります.
インデックスは、複数のカラムに対して設定できます.
CREATE INDEX idx_contacts_name 
ON contacts (first_name, last_name);
複数のカラムをインデックスに設定し、一部のカラムのみを検索する場合は、インデックスを使用しますか?
CREATE INDEX idx_contacts_name 
ON contacts (first_name, last_name);
さっき同じテーブルに新しいインデックスしか追加されませんでした.
first nameクエリのみを使用した結果は次のとおりです.

インデックスにはfirst nameのみが使用されます.
first nameとlast nameを使用してクエリーした結果は、次のとおりです.

インデックスにはfirst nameとlast nameが使用されます.
しかしlast nameクエリーだけを使うとどうなりますか?

インデックスが使用されていないことがわかります.
また、first name、last nameを使用しますが、順序を変更してORクエリを使用した結果は次のとおりです.

同じようにインデックスは使用されません.
sqliteの場合、インデックスは順序付きで、順序通りに使用しないわけにはいきません.
つまり、全部使う必要はありませんが、真ん中から始めることはできません.
また、インデックスはAND条件で接続されているため、OR条件を問い合わせる場合も使用できません.
インデックスを作成しました.どのインデックスを作成したか知りたいかもしれません.
テーブル名を使用してインデックス・リストを表示できます.
PRAGMA index_list('table_name');
インデックス名を追加することで、インデックスの詳細を表示できます.
PRAGMA index_info('idx_contacts_name');
最後にインデックスを作成した場合は、削除する必要がある場合があります.
DROP INDEX [IF EXISTS] index_name;