0Pricing
SQL Academy · レッスン

一般的なクエリ向けインデックス

ユーザー別、日付別、外部キー別など、頻繁に実行するクエリにインデックスを追加し、EXPLAINで効果を測定します。

「一般的なクエリ向けインデックス」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

インデックスとは

インデックスは、テーブル全体をスキャンせずに列の値から行を見つけられる、ディスク上の独立したデータ構造です。典型的な実装はB-treeです。

インデックスは書き込みと引き換えに読み取りを高速化する

インデックスを追加するたびに、INSERT/UPDATE/DELETEは少し遅くなります(インデックスも更新する必要があるためです)。必要のないインデックスは追加しないでください。

主キーには自動的にインデックスが付く

PRIMARY KEYを宣言すると、一意なB-treeインデックスが自動的に作成されます。UNIQUE列も同様です。

外部キー列にインデックスを付ける

PostgreSQLはFKの子側にインデックスを自動作成しません。必ず追加してください。追加しないと、親を削除する際にすべての子をスキャンすることになります:

CREATE INDEX comments_post_id_idx ON comments(post_id);
CREATE INDEX comments_author_id_idx ON comments(author_id);

WHEREで使う列にインデックスを付ける

created_atで頻繁に絞り込む場合は、インデックスを付けます:

CREATE INDEX posts_created_at_idx ON posts(created_at DESC);

-- Query benefits:
SELECT * FROM posts ORDER BY created_at DESC LIMIT 20;

複合インデックス

複数列で絞り込む場合は、単一列のインデックスを2つ作るよりも、複合インデックスのほうが大幅に高速になることがあります:

CREATE INDEX posts_author_published_idx
  ON posts(author_id, published_at DESC);

-- This query uses the index for both filter and sort:
SELECT * FROM posts
WHERE author_id = 42
ORDER BY published_at DESC LIMIT 10;

左端プレフィックスのルール

複合インデックス(a, b, c)は、WHERE a = ?とWHERE a = ? AND b = ?には使えますが、WHERE b = ?だけには使えません。順序が重要です。

部分インデックス

クエリする行だけにインデックスを付けます:

-- Only published posts:
CREATE INDEX posts_published_idx
  ON posts(published_at DESC)
  WHERE published_at IS NOT NULL;

-- Smaller index, faster lookups for the common case.

式インデックス

列に対する関数の結果にインデックスを付けます:

CREATE INDEX users_email_lower_idx ON users(LOWER(email));

-- Query that uses it:
SELECT * FROM users WHERE LOWER(email) = LOWER($1);

インデックスを作りすぎない

経験則:

  • PKにインデックスを付ける ✓(自動)
  • UNIQUE列にインデックスを付ける ✓(自動)
  • FK列にインデックスを付ける ✓
  • 頻繁に実行するクエリのWHERE / JOIN / ORDER BYで使う列にインデックスを付ける
  • 選択性が非常に低い列にはインデックスを付けない(例:50/50に分かれるboolean)

EXPLAINで計測する

インデックスの追加前後にEXPLAIN ANALYZEを実行し、プランナーがそれを使っていることを確認します:

EXPLAIN ANALYZE
SELECT * FROM posts WHERE author_id = 42 ORDER BY published_at DESC LIMIT 10;

まとめ

ブログでは、FK(commentsのpost_id、postsとcommentsのauthor_id)にインデックスを付けます。また、「ユーザー別の最新投稿」クエリ用に、postsの(author_id, published_at DESC)にもインデックスを付けます。

クイックチェック

外部キーorders.user_id REFERENCES users(id)を追加しました。どのインデックスを作成すべきですか?作成する必要がない場合は、その理由も答えてください。

よくある質問

「一般的なクエリ向けインデックス」レッスンは無料ですか?

はい。「一般的なクエリ向けインデックス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「一般的なクエリ向けインデックス」で何を学びますか?

ユーザー別、日付別、外部キー別など、頻繁に実行するクエリにインデックスを追加し、EXPLAINで効果を測定します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「一般的なクエリ向けインデックス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ブログのモデリング:ユーザー、投稿、コメント
  2. キーと型の選択
  3. 一般的なクエリ向けインデックス
  4. テストデータによるデータベースのシード
← SQL Academyに戻る