一般社団法人 全国個人事業主支援協会

COLUMN コラム

RDBのパフォーマンスを向上させる上でインデックスを作成することは最も有効な対応の一つです。
ただし、SQLの記述によってはインデックスが効かなくなることがあります。

今回、「達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ」という本で学習し、インデックスが効かなくなるSQLの記述を理解しましたので、それらを紹介したいと思います。
なお、インデックスにはいくつか種類があり、一番代表的なB-treeインデックスが効かなくなる記述について紹介します。

  • インデックス列に演算を行なっている
    • B-treeインデックスに保持されているのはインデックス列の生データだけなので、WHERE インデックス列 * 1.1 > 100のようにインデックス列に対して演算をしてから比較してしまうと、インデックスを使用することが出来ません。
  • インデックス列に対してSQL関数を適用している
    • インデックス列に対して演算を行うのと同様に、WHERE  SUBSTR(インデックス列, 1, 1)のように関数を適用すしてしまうと、インデックスを使用することが出来ません。
  • IS NULL関数を使用している
    • B-treeインデックスでは基本的にNULLをデータとして認識していないので、保持していません。そのため、WHERE インデックス列 IS NULLのように記述すると、インデックスが使用出来ません。
  • 否定系を用いている
    • B-treeインデックスでは対象データを検索することは出来ますが、対象データ以外のデータを検索することは出来ません。そのため、WHERE インデックス列 <> 100のように記述すると、インデックスを使用することは出来ません。
  • 後方一致、または中間一致のLIKE述語を用いている
    • B-treeインデックスでは前方一致のLIKE述語でしか検索出来ません。そのため、WHERE インデックス列 LIKE "%a"WHERE インデックス列 LIKE %a%のように記述すると、インデックスを使用することは出来ません。
  • 暗黙の型変換を行なっている
    • インデックス列と異なるデータ型を条件に指定した場合、DBMSは内部的に暗黙の型変換を行うが、このときインデックスは使用されない。例えば、インデックス列がstring型の場合、WHERE インデックス列 = 100のように記述すると、インデックスを使用することは出来ません。

「達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ」では、以下についてもインデックスが効かなくなると記載がありましたが、MySQL5.6で検証したところ、インデックスが効きましたので、注意として記載しておきます。

The following two tabs change content below.

植木 宥登

最新記事 by 植木 宥登 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア