0

mysql (innodb) は、(A) または (B) のようなクエリのより高いレート (1 秒あたりのクエリ数) をサポートしますか?

(ア)SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300

(A) では、主キーは 800 行の範囲を選択します。「x」は索引付けされていません。1 つの範囲ルックアップと、長さ 200kb の 1 つの連続読み取りがあります。

(ロ)(SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300) UNION ALL (SELECT * FROM t1 WHERE pkey BETWEEN 3000 and 3001 AND x > 300)

(B) では、主キーは 200 行の範囲を選択します。「x」は索引付けされていません。2 つの範囲ルックアップと、長さ 50kb の 2 つの連続読み取りがあります。

要約すると、(A) のディスク シークは 2 倍ですが、連続読み取りは 1/2 です。逆に、(B) はディスク シークが半分ですが、連続読み取りは 2 倍です。

一般に、シークは遅く、連続した読み取りは高速だと思いますが、10MB の余分なデータを読み取るよりも、1 回余分にシークする方が望ましいと思います。大まかに言って、トレードオフポイントはどこですか?

4

2 に答える 2

0

オプティマイザーは、クエリの実装方法を決定する必要があります。好きなように書いてください。

EXPLAIN を使用して、何が行われたかを大まかに確認します。pkey のインデックスで 2 つの範囲スキャンを実行している可能性があります。

一般に、読み取る行数が少ないほど優れています。それらをさらにバッファ プールに保持することもできます。一般的なケースでは、1 回よりも 2 回の範囲スキャンの方が優れています。

テーブル t1 がメモリに完全に収まらないと仮定しています。その場合、ほとんどがアカデミックです。

于 2010-02-26T07:17:57.467 に答える
0

EXPLAIN からの出力で 2 つのオプションを補足する必要があります... 理論的にどちらが速いかだけでなく、MySQL がどのような最適化を利用できるかが重要です。

推測させてください:

a) クラスター化されたインデックス上にあるため、範囲指定された pkey ルックアップは非常に効率的です。範囲内のすべてについて、「次、次の次」と読み、X が一致するかどうかを確認します。

b) これは一連のポイント ルックアップです。ただし、結果をパイプライン処理できると考えていても、一時テーブルが作成されます(!) http://www.facebook.com/note.php?note_id=276225210932

私の投票はほぼ間違いなく (a) です。

于 2010-07-24T14:11:47.043 に答える