バージョン1(ユニオンの両側にある個別のwhere句)の方が高速になることは間違いありません。バージョン(ユニオンの結果に対するwhere句)が悪い理由を見てみましょう:
- データ量:返される行の条件が少ないため、ユニオンの結果には常により多くの行が含まれます。これは、より多くのディスクI / O(インデックスに応じて)、行セットを保持するためのより多くの一時ストレージを意味し、より多くの処理時間を意味します
- 繰り返しスキャン:条件を適用するには、最初のスキャン中に処理できた可能性がある場合に、ユニオンの結果全体を再度スキャンする必要があります。これは、おそらくメモリ内ではありますが、行セットを二重に処理することを意味しますが、それでも余分な作業です。
- インデックスは、ユニオン結果のwhere句には使用されません。外部キーフィールドのインデックスがある場合および postType、使用されません
最大限のパフォーマンスが必要な場合は、UNION ALL
を使用してください 、UNION
の代わりに、オーバーヘッドなしで行を結果に直接渡します。 、重複を削除し(通常は並べ替えによって)、費用がかかる可能性があり、コメントに基づいて不要です
これらのインデックスを定義し、バージョン1を使用して最大のパフォーマンスを実現します。
create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);