SQLite で CREATE INDEX ステートメントを使用してインデックスを作成する方法
SQLite で CREATE TABLE ステートメント時に列をインデックス化する方法
インデックスの種類
SQLite では、主に以下の 2 種類のインデックスを作成できます。
- B-Tree インデックス: データの効率的な検索とソートに使用されるデフォルトのインデックス
- ハッシュインデックス: 等価比較 (WHERE 句での
=
) に特化して高速化
インデックスの作成方法
CREATE TABLE
ステートメントに INDEX
キーワードを追加することで、インデックスを作成できます。
CREATE TABLE テーブル名 (
列名1 型,
列名2 型,
...
INDEX インデックス名 (列名1, 列名2, ...)
);
例:
name
列とage
列に基づいてインデックスを作成する
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER,
INDEX name_age_index (name, age)
);
- 一意のインデックスを作成する (重複値不可)
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE
);
- 特定の列に基づいてデータの検索速度を向上させる
- データのソート速度を向上させる
- 一意制約を設定することで、重複値を防止する
- インデックスを作成すると、テーブルのサイズが大きくなる
- データの更新時にインデックスも更新する必要があるため、処理速度が遅くなる場合がある
インデックスの必要性
インデックスは常に必要というわけではありません。以下の場合には、インデックスを作成する必要はありません。
- テーブルのデータ量が小さい
SQLite で CREATE TABLE
ステートメント時に列をインデックス化するには、INDEX
キーワードを使用します。インデックスは、データ検索速度の向上や一意制約の設定などに役立ちますが、テーブルサイズや処理速度への影響も考慮する必要があります。
-- テーブルの作成
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER,
INDEX name_age_index (name, age)
);
-- インデックスを使用したデータの検索
SELECT * FROM users WHERE name = 'John' AND age > 18;
-- 一意制約を使用した重複値の防止
INSERT INTO users (name, age) VALUES ('John', 30);
-- エラー: 'John' という名前のユーザーが既に存在するため
-- インデックスの削除
DROP INDEX name_age_index ON users;
このサンプルコードは、SQLite でインデックスを作成する方法を理解するのに役立ちます。
SQLite で CREATE TABLE ステートメント時に列をインデックス化する他の方法
PRIMARY KEY
制約は、テーブル内の各行を一意に識別する列を指定します。PRIMARY KEY
列は自動的にインデックス化されます。
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
この例では、id
列は PRIMARY KEY
制約によって一意に識別されるため、自動的にインデックス化されます。
UNIQUE
制約は、列に重複値を許可しないことを指定します。UNIQUE
制約列も自動的にインデックス化されます。
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT UNIQUE
);
USING
キーワードを使用して、既存のインデックスを別のテーブルで使用できます。
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER,
FOREIGN KEY (user_id) REFERENCES users (id) USING INDEX name_age_index
);
この例では、orders
テーブルの user_id
列は users
テーブルの name_age_index
インデックスを使用してインデックス化されます。
CREATE INDEX
ステートメントを使用して、テーブル作成後にインデックスを作成できます。
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
CREATE INDEX name_age_index ON users (name, age);
この例では、users
テーブルに name_age_index
という名前のインデックスが作成されます。
INDEX
キーワード以外にも、PRIMARY KEY
制約、UNIQUE
制約、USING
キーワード、CREATE INDEX
ステートメントを使用して、SQLite で CREATE TABLE
ステートメント時に列をインデックス化できます。
sqlite