1

最高のパフォーマンスを得るために最初にフィルタリングする方が良いというクエリのルールはありますか? 例:

SELECT * FROM table WHERE date <= '2012-08-01' AND random_field = 4684 AND primary_field = 355

SELECT * FROM table WHERE random_field = 4684 AND primary_field = 355 AND date <= '2012-08-01'

どちらが速いですか?クエリに配置する where フィールド句の位置はパフォーマンスに影響しますか? 比較するべきか

  • プライマリ フィールドが最初ですか?
  • 最初にインデックス付きフィールド?
  • 整数フィールドが最初ですか?
  • 日付フィールドが最初ですか?
  • 文字列フィールドが最初ですか?
  • サブクエリ フィールドが最初ですか?

あなたが知っている、人気のある mysql クエリ ガイドはありますか?

4

2 に答える 2

2

条件がWHERE句に配置される順序はまったく問題ではありません。重要なのは、テーブルにあるインデックスです。

このクエリの場合:

SELECT * 
FROM table 
WHERE random_field = 4684 
  AND primary_field = 355 
  AND date <= '2012-08-01' ;

適切なインデックスは、または次のいずれ(random_field, primary_field, date)かです(primary_field, random_field, date)

なんで?等値条件を持つ列 ( random_field、 ) が最初にインデックスに配置され、次に範囲条件を持つ列 ( ) が配置されるためです。primary_fielddate


名前primary_fieldはかなり奇妙です。これが実際にPRIMARY KEYテーブルの である場合 (または、UNIQUE制約があり、したがって一意のインデックスがある場合)、このクエリに必要なのはこれだけです。この (プライマリまたは一意の) インデックスは、私がアドバイスした上記のインデックスと同じくらい選択的です。により、条件は多くても 1 行で一致primary_field = @constantするため、追加のインデックスは必要ありません。

于 2013-02-22T10:21:29.153 に答える
0

私たちはいくつかの規則に従うべきです

1. comparison of primary fields should come first and then indexed (because this will filter out required value )
2. Date or range wise (example 2<id<6) should come at the end.
于 2013-02-22T10:23:53.913 に答える