インデックスの作り過ぎ


関数インデックスの考え方を初めて知ると、あらゆるものに インデックスを作成したくなってしまうかもしれません。しかし、 それは本当に最後の手段です。全てのインデックスは、継続的な メンテナンスが必要になるからです。関数インデックスは、冗長な インデックスを作ってしまいがちという点で、特に 厄介です。

このウェブサイトにぴったりのカップは僕たちのショップにあります。
#見た目もいい感じだし、ここでの僕の仕事を支えてくれています

ここまで取り上げたような大文字 小文字を区別しない検索は、以下のようにLOWER関数を 使っても実装できます。

SELECT first_name, last_name, phone_number
  FROM employees
 WHERE LOWER(last_name) = LOWER('winand')

1つのインデックスで、どちらのタイプの大文字小文字を区別しない 検索もサポートすることはできませんので、もちろん LOWER(last_name)にもう1つインデックスを作ることもできます。 しかし、insert文やupdate文、 delete文が実行されるたびに、どちらのインデックスも 更新しなくてはなりません(第8章, 「データの変更を参照)。1つのインデックスで 間に合わせるには、アプリケーション全体で、一貫して同じ関数を使う 必要があります。

Tweet this tip

ヒント

1つのインデックスを複数のクエリで使えるように、 アクセスパスを統一しましょう。

警告

ORMツールは、開発者が知らないうちにUPPERLOWERを使うことがあります。例えばHibernateは、 大文字小文字を区別しない検索に対して、暗黙的にLOWERを 付加します。

Tweet this tip

ヒント

いつも最適な情報がインデックスに入るように、なるべくオリジナルの データにインデックスを作成するように常に心がけましょう。

Photo of Markus Winand
Markus Winand氏は、開発者がSQLパフォーマンスを改善するお手伝いをしています。 彼は、SQL Performance Explainedの 著者でもあり、出張トレーニングhttp://winand.at/での リモート講義も 行っています。