SQL:INDEXが効かない理由 – LIKE検索・関数使用・暗黙的変換に注意

  • URLをコピーしました!

SQLをチューニングする際、「INDEXを作成したのに処理が遅い」「想定通りにINDEXが使われていない」と感じた経験は多いのではないでしょうか。
この問題は、単純にINDEXが不足しているのではなく、SQLの書き方そのものが原因であるケースが非常に多く見られます。

本記事では、INDEXが効かなくなる代表的な原因として、LIKE検索、関数の使用、暗黙的な型変換の3点に焦点を当て、なぜINDEXが使われなくなるのか、どのように書き換えるべきかを具体例とともに解説します。


目次

INDEXが使われる基本条件

INDEXが使われる基本条件

まず前提として、INDEXは「WHERE句で指定した条件をもとに、対象行を素早く絞り込む」ための仕組みです。
データベースは、INDEXを使うことで全件走査(フルスキャン)を回避し、必要な行だけを効率良く取得します。

しかし、以下のような場合にはINDEXの利用が難しくなります。

・列に対して加工や変換が行われている
・検索条件がINDEXの並び順と一致していない
・比較対象のデータ型が一致していない

これらは一見些細な違いに見えますが、実行計画に大きな影響を与えます。


LIKE検索でINDEXが効かない典型例

LIKE検索は文字列検索で頻繁に使用されますが、書き方によってはINDEXがまったく利用されません。

前方一致・中間一致・後方一致の違い

次のようなSQLを比較してみます。

このような前方一致検索は、INDEXが利用される可能性があります。
理由は、検索条件の先頭が固定されており、INDEXの並び順を活用できるためです。

一方で、以下のような書き方は注意が必要です。

これらは後方一致や中間一致となり、INDEXは基本的に使用されません。
先頭がワイルドカード(%)の場合、どの値から検索を開始すべきか判断できないため、全件走査が選択されます。

対策の考え方

・前方一致で検索できる設計に変更する
・検索用に別の列を用意する
・全文検索インデックスなど、用途に合った仕組みを利用する

LIKE検索を多用する設計では、最初からINDEXが使えないケースがあることを前提に検討する必要があります。


WHERE句で関数を使用するとINDEXは使われない

INDEXが効かない原因として非常に多いのが、列に対して関数を適用しているケースです。

典型的な例

このSQLでは、created_at列に関数が適用されています。
その結果、データベースはINDEX上の値をそのまま利用できず、全行に対して関数を評価する必要が生じます。

INDEXを効かせる書き方

次のように条件を変更すると、INDEXが利用される可能性が高まります。

列側を加工せず、比較値側を調整することが重要です。

よくある関数使用例

・TO_CHAR
・SUBSTR
・UPPER / LOWER
・TRUNC

これらをWHERE句で使用する場合は、INDEXが効かなくなる可能性を常に意識する必要があります。


暗黙的な型変換によるINDEX無効化

暗黙的変換は、SQL上ではエラーにならないため見落とされがちですが、パフォーマンス面では非常に危険です。

数値列と文字列の比較

user_idが数値型の場合、データベースは内部で暗黙的な型変換を行います。
多くのDBでは、列側が変換対象となるため、結果としてINDEXが使われません。

日付列との文字列比較

このような比較も暗黙的変換が発生します。
見た目は正しくても、実行計画上はフルスキャンになる可能性があります。

明示的に型を合わせる

比較するデータ型を明示的に合わせることで、INDEXが正しく利用されるようになります。


実行計画で必ず確認する

INDEXが使われているかどうかは、実行計画を確認しなければ判断できません。
「INDEXがある=使われる」と思い込むのは非常に危険です。

実行計画を見ることで、以下を確認できます。

・INDEX SCAN か TABLE SCAN か
・想定外のフルスキャンが発生していないか
・条件の書き方が最適か

INDEX SCAN と TABLE SCAN を比較した実行計画のイメージ図

SQLのチューニングでは、INDEXが使われているかどうかを判断するために、実行計画の確認が欠かせません。
実行計画(EXPLAIN PLAN)の基本的な読み方や、処理が遅くなる原因となるボトルネックの見つけ方については、以下の記事で詳しく解説しています。

よくある質問(Q & A)

INDEXがあるのに必ずフルスキャンになるのはなぜですか?

LIKE検索の書き方、列への関数適用、暗黙的な型変換などにより、INDEXが利用できない状態になっている可能性があります。

LIKE検索は必ずINDEXが使えないのですか?

前方一致(’文字列%’)であれば、INDEXが使われる可能性があります。先頭に%がある場合は基本的に使われません。

関数を使うと必ずINDEXは無効になりますか?

列側に関数を適用した場合は無効になるケースが多いです。条件値側を加工する形に書き換えることで回避できます。

暗黙的変換はエラーにならないので問題ないのでは?

動作上は問題ありませんが、INDEXが効かなくなり、パフォーマンス低下の原因になります。

実行計画は毎回確認すべきですか?

はい。特に本番環境で使用するSQLは、必ず実行計画を確認することをおすすめします。


まとめ

INDEXが効かない原因の多くは、SQLの書き方にあります。
LIKE検索、関数の使用、暗黙的な型変換は、いずれも意識せずに使ってしまいがちな要素です。

・列を加工しない
・データ型を正しく合わせる
・INDEXの特性を理解する

これらを意識することで、SQLのパフォーマンスは大きく改善します。

よかったらシェアしてね!
  • URLをコピーしました!
0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
目次
0
あなたの考えが大好きです、コメントしてください。x