フルスキャンとインデックスの制御

 

OPTIMIZER_INDEX_COST_ADJを指定すると、オプティマイザがアクセス・パスを選択するときに、索引を使用する傾向の強さを調整できます。
つまり、オプティマイザが全表スキャンよりも索引アクセス・パスを選択する傾向を、強めたり弱めたりすることができます。
このパラメータのデフォルトは100パーセントで、その場合、オプティマイザは索引アクセス・パスを通常コストで評価します。
その他の値にすると、オプティマイザはアクセス・パスを通常コストのその割合で評価します。
たとえば、50に設定すると、索引アクセス・パスのコストは通常の半分で見積もられます。

show parameter optimizer_index_cost_adj
alter session set optimizer_index_cost_adj = 1;

select @@max_seeks_for_key;

MySQL オプティマイザは、インデックスをスキャンすることによってテーブル内で一致する行を検索するとき、
インデックスの実際のカーディナリティーに関係なく、この数を超えるキーシークは不要であると推定します。
これを低い値 (100 など) に設定することで、MySQL でテーブルスキャンよりもインデックスを優先するように強制できます。

 

show enable_seqscan;

問い合わせプランナがシーケンシャル走査計画を選択することを有効もしくは無効にします。
シーケンシャル走査を完全に禁止することは不可能ですが、
この変数をオフにすると、もし他の方法が利用できるのであれば、プランナはその使用を行わないようになります。デフォルトはonです。

show enable_indexscan;

問い合わせプランナがインデックス走査計画型を選択することを有効もしくは無効にします。デフォルトはonです。

show effective_cache_size;

単一の問い合わせで利用できるディスクキャッシュの実効容量に関するプランナの条件を設定します。
これは、インデックスを使用するコスト推定値の要素となります。
より高い値にすれば、よりインデックススキャンが使用されるようになり、
より小さく設定すれば、シーケンシャルスキャンがより使用されるようになります。


set enable_seqscan = off;
set enable_indexscan = on;
set effective_cache_size = 1000000000;

調べた限りなし