2

クエリが次の形式に縮小された場合:

select b.field1
from table_a a
    inner join table_b b on b.field1 = a.field1
    left join table_c c on c.field1 = a.field1
    left join table_d d on d.field1 = b.field1
    left join table_e e on e.field1 = b.field6
group by b.field1,
         b.field2,
         b.field3,
         b.field4,
         b.field5,

         e.field2,
         e.field3
;

一定量のデータを使用すると、Oracle で 20 秒で実行されます。Oracle では何も索引付けされていません。MySQL に移行しても、クエリは完了しません (数分で実行されます)。問題のすべてのフィールドは、MySQL でインデックス化されています。Explainすべてが順調であることを伝えます。

それでも機能しない後、グループ化フィールドは複数列のインデックスを取得しました。まだ何もありません。

MySQL のパフォーマンスにまだ大きなリークがあるという問題は何ですか? 高速化する方法はありますか?

4

1 に答える 1

8

Oracleハッシュ結合とマージ結合を実行できますが、できMySQLません。

テーブルはどのようにもフィルタリングされないため、特にインデックスがない場合は、ハッシュ結合が結合を実行するための最も効率的な方法になります。

ネストされたループでは、すべての結合フィールドにインデックスが付けられている場合でもMySQL、ループ内の先頭のテーブルから各値に対してインデックスシークを実行し(毎回ルートインデックスページから開始)、テーブルルックアップを実行してレコードを取得する必要があります。結合されたテーブルごとに繰り返します。これには、ランダムなシークが多数含まれます。

一方、ハッシュ結合では、小さい方のテーブルを1回スキャンして(ハッシュテーブルを作成)、次に大きい方のテーブルを1回スキャンして(作成したハッシュテーブルを検索する)必要があります。これには、はるかに高速な順次スキャンが含まれます。

また、ネストされたループでは、左結合テーブルは駆動(内部ループでスキャン)のみが可能ですが、ハッシュ結合では、どちらかの側のテーブルが先行(スキャン)または駆動(ハッシュされてから検索)されます。これはパフォーマンスにも影響します。

MySQLのオプティマイザは、他のエンジンにはないいくつかの便利なトリックをサポートしていますが、他のエンジンと比較して機能が非常に制限されており、現在、ハッシュ結合もマージ結合もサポートしていません。したがって、このようなクエリはMySQL、同じデータの他のエンジンで高速であっても、おそらく低速になります。

于 2012-06-08T17:50:51.213 に答える