検索結果が多い
検索結果がテーブル全体の20%未満(実務では10%未満を目標にすると良いです。)、正直選択率が10%を超えていた場合はインデックススキャンよりもフルスキャンの方が望ましいでしょう。
全体の件数が少ない
数万〜数十マン行が目安になります。1000行程度のテーブルであればindexよりもテーブルスキャンが効率的です。
条件にその列を使ってない。
これも当たり前ですね。これだとインデックスが使われません。
1 |
SELECT * FROM users WHERE num*10 > 100; |
このように修正すると使われます。
1 |
SELECT * FROM users WHERE num > 100/10; |
LIKE検索(あいまい検索)は前方一致しか効かない
1 |
SELECT * FROM users WHERE name LIKE '%田中%'; |
カラムnameにインデックスを適用した場合には、前方一致(上記例で言えば「田中%」)のみでしか効きません。中間一致(「%田中%」)や後方一致(「%田中」)では効かないので注意が必要です。
検索条件にIS NULLを使っている。
1 |
SELECT * FROM users WHERE name IS NULL; |
これもインデックスは効きません。牽引データの中には通常NULLは含まれないのでインデックスは効きません。
関数を使っている場合も効かない。
1 |
SELECT * FROM users WHERE LENGTH(name) = 5; |
これも牽引列に四則演算を使っている場合と同様にインデックスが適用されません。理由としてはインデックスの中に存在する値はあくまでnameであり、LENGTH(name)の計算結果ではないためです。
カーディナリティの低い列に対する検索
カーディナリティとは?
「列に格納されるデータの値にどれくらいの種類があるのか?」のこと。
つまり、種類が少なく重複が多い列の場合はインデックスは効かないです。
あいまい検索
前方一致と完全一致しか効きません。
統計情報と実際のテーブルで乖離がある場合
統計情報とは?
定期的にテーブルから一定数のサンプリングを行いそれを元に作られる情報のことです。
ただ、以下の場合に「実際のテーブルのデータ分布と乖離した統計情報」が作られる場合もあります。
サンプリングの前に大量データ更新が行われた場合(バッチで大量にinsert、updateした場合など)
サンプリングで偏ったデータを収集した場合
このような場合は、統計情報の更新を行うか、利用する統計情報を固定する方法(ヒント句)があります。
この記事へのコメントはありません。