2011-08-09 4 views
7

だから私はいつもExtraカラムの "Where Using"を見るのは良いことだと思っていました。しかし、私はEXPLAINをintepretingすることで同僚のために茶色のバッグランチを計画していましたが、今はそれほど確かではありません。 MySQLディクショナリは、 "Where Using"に関する注記でこれを示しています。MySQLの最適化:EXPLAIN "Extra"カラムに "Where Using"が含まれています

WHERE句を使用して、次のテーブルとの一致またはクライアントへの送信を制限します。テーブルからすべての行を取り出したり調べたりするつもりがない限り、Extra値がWhere whereを使用せず、テーブル結合タイプがALLまたはindexの場合は、クエリに問題がある可能性があります。 WHERE句のすべての部分にインデックスを使用していても、カラムがNULLの場合はWhereを使用すると表示されることがあります。

これは、ということを信じるように私をリードしても、私の句は唯一の列がNULL値を持つことができる場合、MySQLはまだ行を検討することを、インデックスの一部が含まれています。

本当ですか?もしそうなら、私はそれを必要としない場合はNULLを含まないように列を変更すべきですか?私はスピードブーストを見ますか?

+0

私はちょうどテストをしました:列をヌルからヌルに変更してから "どこで使うか"が消えました。 – tomwang1013

答えて

5

ヌル状態をチェックする必要があるため、ヌル可能な列にはオーバーヘッドがあります。列がnullである必要がない場合、または要件がnullを許可しない場合は、必ず列not nullを作成します。

インデックスについては、インデックスの構成によって異なります。インデックスが(a,b,c)で定義されていて、where句でb,cを使用している場合は、aが再生されていないため、このインデックスを使用できません。

+0

ちょっと@Marc、返事をありがとう。私はマルチパートインデックスの仕組みを理解しています。私は私が尋ねていることを推測しています:インデックス(a、b、c)と "a =?とb =?とc =?"のテーブルからselect a、b、cのようなクエリを持つテーブルを持っていれば列cがヌル可能な場合、MySQLは引き続き各行を検査する必要がありますか、または索引で完全に問合せを解決していますか? –

+0

これは/ bに基づいて部分的にフィルタリングすることができますが、nullをチェックするためにCで余分な作業を行う必要があります。インデックスなしよりも効率的ですが、3つの列がすべてnullでない場合は効率的ではありません。 –

関連する問題