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