【いんでっくす】

インデックス(データベース) とは?

最終更新:
💡 索引で検索を助け、更新のコストも考える

条件に合う行を見つける処理などを助ける、データベースの索引構造。検索対象を絞ったり並び順を利用したりできる一方、保存領域と更新の手間が増える。作成しても、すべての検索で使われるとは限らない。

📌 このページのポイント
索引:行を探す手がかり 例:名前=山田 名前の索引 山田 → ID 4 ID 名前 1 佐藤 2 田中 3 鈴木 4 山田 元のテーブル 条件に合う行を探す範囲を減らす 保存領域・更新の手間が必要 使うかどうかは実行計画で確認 全行を読むほうが有利な場合もある
索引から対象の行を探す簡略例で、木の内部構造や処理回数を表すものではない。索引の種類や条件、データによって使い方と効果は異なる。
ひよこ ひよこ
インデックスがあれば、必ず何万倍も速い?
ペンギン先生 ペンギン先生
決まった倍率はないよ。条件に合う少数の行を探すとき、索引で探す範囲を減らせる場合がある。一方、テーブルの多くの行を読むなら、順番に読むほうが効率的なこともある。比較回数の比を、そのまま処理時間の倍率にはできないんだ。
ひよこ ひよこ
どんな索引も同じ検索に使える?
ペンギン先生 ペンギン先生
種類によって違うよ。例えばPostgreSQLのB-treeは値の一致や範囲、並び順に使える。HashやGINなど別の種類には異なる得意分野がある。条件の演算子、データ、DBMSの対応を踏まえ、よく実行するSQLに合う索引を考えるんだ。
ひよこ ひよこ
複合インデックスは、列の順番が大切?
ペンギン先生 ペンギン先生
複数の列をまとめた索引だよ。一般にB-treeでは先頭側の列の条件が探す範囲を絞るうえで重要だけれど、先頭列の条件がないと絶対に使えないわけではない。DBMSや版によって、後ろの列の条件で使う方法もある。実行計画で確認しよう。
ひよこ ひよこ
索引は多いほど便利?
ペンギン先生 ペンギン先生
保存領域が必要で、INSERTやUPDATEなどの際には索引を維持する手間も増えるよ。検索に使われない索引まで増やすと、更新側の負担になる。値の種類の数だけで有効・無効を決めず、条件で絞れる量や更新頻度も考えるんだ。
ひよこ ひよこ
EXPLAINを見れば速さが分かる?
ペンギン先生 ペンギン先生
選ばれた実行計画や推定コストを確認できるよ。ただし表示項目はDBMSによって異なり、索引を使うだけで速いとは言えない。PostgreSQLのrowsは、その処理が出す行数の推定で、読んだ全行数ではない。実際の時間を測る方法とは分けて読み、データや統計も確認するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「インデックス」って出てきたら「DBの検索を助ける、更新コストもある索引」と思えばだいたいOK!
📖 おまけ:英語の意味
「Database Index」 = データベース索引
💬 Index(索引)。本の後ろにある「あ行→○ページ」のような仕組みをDBに適用したよ

参考資料

← 用語集にもどる