web-dev-qa-db-ja.com

WHERE句のフィールドの順序はMySQLのパフォーマンスに影響しますか?

テーブルには2つのインデックス付きフィールドがあります-typeuserid(複合ではなく個々のインデックス)。

typesフィールドの値は非常に制限されているため(0または1のみ)、テーブルレコードの50%が同じtypeを持っています。一方、userid値ははるかに大きなセットから取得されるため、同じuseridを持つレコードの量は少なくなります。

これらのクエリはいずれも他のクエリよりも高速に実行されますか?

select * from table where type=1 and userid=5
select * from table where userid=5 and type=1

また、両方のフィールドにインデックスが付けられていない場合、動作が変わりますか?

43
serg

ほとんどのクエリオプティマイザーは、条件がヒントとして表示される順序を使用します。他のすべてが等しい場合、それらはその順序に従います。

ただし、多くのものがそれをオーバーライドできます。

  • 2番目のフィールドにはインデックスがあり、最初のフィールドにはない
  • フィールド2がより選択的であることを示唆する統計があります
  • 2番目のフィールドは検索が簡単です(varchar(max) vs int

そのため(そして、これはすべてのSQL最適化の質問に当てはまります)パフォーマンスの問題を観察しない限り、(想像される)パフォーマンスではなく、明快さのために最適化することをお勧めします。

10
Andomar

あなたの小さな例ではないはずです。クエリオプティマイザーは正しいことを行う必要があります。クエリの前にexplainを追加することで、確認できます。 MySQLは、物事をどのように結合しているか、および結合を行うために検索する必要がある行数を教えてくれます。例えば:

explain select * from table where type=1 and userid=5

インデックスが作成されていない場合、おそらく動作が変更されます。

7
Cfreak