データベースのインデックスが機能しない代表的な条件と回避策

こんにちは。ゆうせいです。

前回の記事では、B-treeインデックスと複合インデックスの基本的な仕組みについて解説しました。本記事では、データベースにインデックスを作成したにもかかわらず、検索処理でインデックスが使われない条件について、新人エンジニアの皆様に向けて解説します。

あいまい検索における先頭文字の省略

検索条件で一部の文字列が一致するデータを探すあいまい検索を行う際、検索キーワードの先頭に任意の文字列を許容する条件を指定すると、インデックスは機能しません。中間一致検索や後方一致検索と呼ばれる手法が該当します。

あいまい検索でインデックスが使われない現象は、国語辞典で「ん」で終わる単語を探す状況に似ています。国語辞典は最初の文字から順番に並んでいるため、最初の文字が指定されていない状態では見出しをたどることができず、すべてのページを最初から確認する必要があります。

データベースのインデックスも同様に、先頭の文字から順番にデータを階層化して整理しているため、先頭の文字が不明な場合はインデックスの構造を活用できません。

検索列に対する演算や関数の適用

検索条件を指定する際、データベースの列に対して四則演算を行ったり、関数と呼ばれるデータ加工処理を適用したりすると、インデックスは無効になります。

例として、商品の税抜き価格を保存している列に対して、消費税を含めた計算結果で検索を行うSQL文を提示します。

SELECT id, product_name FROM products WHERE price * 1.1 = 1100;

上記のような記述を行うとインデックスは使われません。あらかじめ五十音順に整理された名簿の名前を、すべて逆から読み替えてから指定の人物を探すように指示される状況を想像してください。逆から読み替えた時点で、元の名簿の五十音順という並び順は役に立たなくなります。インデックスを有効にするためには、データベースの列に対して計算を行うのではなく、検索する値の側に対して計算を済ませておく記述に変更する必要があります。

データ型の不一致による自動変換

データベースの列に設定されたデータの種類(文字列、数値など)と、検索条件として指定した値のデータの種類が異なる場合、インデックスが機能しない事象が発生します。

例えば、社員番号を文字列として保存している列に対して、数値として検索条件を指定した場合です。データベース内部では、検索エラーを防ぐために数値を文字列に合わせる変換処理が自動的に行われます。自動的な変換処理が列のデータ全体に対して適用されることで、列に対する関数の適用と同じ状態に陥り、インデックスが使えなくなります。データベースに問い合わせを行う際は、常に列のデータ型と検索値のデータ型を一致させることが重要です。

複合インデックスの順序違反

前回の記事でも触れた複合インデックスに関する規則です。複数の列を組み合わせた複合インデックスでは、インデックスを作成した列の順番通りに検索条件を指定する必要があります。

都道府県、市区町村の順番で作成したインデックスに対し、市区町村のみを指定して検索を行った場合、インデックスは機能しません。電話帳で全国の住所から特定の市区町村のみを探す状況と同じであり、あらかじめ設定された並び順の前提が崩れるためです。

該当するデータの割合が多い場合

検索条件に一致するデータが、データベースの表全体のデータの中で大部分を占める場合、データベース管理システムはインデックスを使わない方が早いと判断することがあります。

システムの判断基準は、本の索引の使い方に例えることができます。本の中から特定の専門用語が書かれた数ページを探す場合は、巻末の索引を使う方法が便利です。しかし、本の中で「です」「ます」という一般的な言葉が使われているページを探す場合、ほぼ全ページが該当します。わざわざ索引のページと本文の該当ページを何度も往復するよりも、最初から本全体を通読した方が早く目的を達成できます。データベースも同様の合理的な判断基準を持っており、データを直接順番に読み取るフルスキャンという処理を自動的に選択します。

まとめ

インデックスはデータベースの検索を高速化する強力な機能ですが、どのような条件下でも必ず働くわけではありません。インデックスの構造や特性を理解せずに検索条件を記述すると、想定外の性能低下を引き起こす原因となります。

インデックスの仕組みを考慮したシステム開発を行うため、以下のステップで学習を進めてください。

  1. データベースのデータ型と、プログラム言語側のデータ型が正確に一致しているかを確認する習慣をつける
  2. 検索条件を記述する際、データベースの列に対して計算や変換処理を行っていないか見直す手順を確立する
  3. 実行計画を確認するコマンドを活用し、どのような検索条件を書いた際にインデックスが外れるのか、実際のデータベース環境で検証を行う

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。