こんにちは。バックエンドエンジニアの小佐野です。
ゼロイチでもエンジニアの技術ブログを始めてみることにしました。
まずは、これまでOracleを色々触ってきた経験を元に、データベース(RDBMS:Relational DataBase Management System)の基礎的な考え方を、Oracle Databaseを例に解説していきます。
今回はデータベースをある程度使ったことがある技術者向けに、インデックスについて記載します。
「インデックスを張ると検索が速くなる」というイメージがあるかと思います。
間違いではないのですが、必ずしも速くなるわけではありません。
インデックスが効果を発揮するケースは
・取得したいテーブルに登録されているレコード数が多い(数千件以上)
・取得したいレコードの割合が少ない(全レコードの10~20%程度が上限といわれています)
となります。
レコード数が多い、については
レコード数が少なければ全量取得して、その中から取得したいレコードを探す方が速い、ということになります。
レコードの割合が少ない、についても同じような理由ですが、
割合が多くて取得したいレコードを絞り込めないのであれば、全量取得の方が速い、ということになります。
簡単に言うと、取得するレコード数が多い場合はインデックスの効果がありません。
「取得したいレコード数が少ないのに遅い」というケースはインデックスの張り方に誤りがある可能性があります。
勘違いしやすいポイントとして、インデックスには順番がありますので、順番を意識する必要があります。
簡易な例として、下記のような社員テーブルでは、「姓」だけ、「姓」+「名」の2パターンではインデックスが効きますが、「名」だけではインデックスが効きません。
社員(インデックス:姓-名)
姓 | 名 |
---|---|
佐藤 | 一郎 |
佐藤 | 次郎 |
鈴木 | 花子 |
「名」だけ、の検索をする可能性がある場合、「名」のみのインデックスを追加すべき、となります。
(追加後は「インデックス1:姓-名」、「インデックス2:名」となります。)
次回以降もOracle関連のテーマについて記載していこうと思います。
・実行計画の作成(オプティマイザ)
・統計情報
・SQLのチューニング
etc.