mysql - これら 2 つの SQL ステートメントでは、1 つは or を使用し、もう 1 つは Union all を使用します。パフォーマンスは後者よりも優れているはずですよね?
PHPz
PHPz 2017-05-18 10:56:52
0
2
1151
リーリー

これはすべてユニオンです

リーリー
PHPz
PHPz

学习是最好的投资!

全員に返信(2)
PHPzhong

まず第一に、これら 2 つのクエリ間のパフォーマンスの差は大きくないはずです。
ad_id 列が主キーであるためです。

型列分析によると:
またはクエリ、type: rangetype:range
union all 查询:type:const / const / ALLunion allクエリ: type: const / const / ALL

最初に確認できるのは、const の方が range よりも優れているということです。const 要优于 range.
constconst は、ad_id が主キーであるためでもあります。

しかし、union all は 3 つの操作、2 つの主キーまたは一意のインデックス クエリ type:const を実行しますが、最終的に結合された type:ALL
type:ALL 自体のパフォーマンスは range よりも劣ります

タイプの観点から見ると、クエリのパフォーマンスが向上するはずです。

追加分析
またはクエリ: インデックス条件を使用するUsing index condition
union all 查询:NULL / NULL / Using temporary全結合クエリ: NULL / NULL / 一時的な使用

インデックス条件の使用は、MySQL 5.6 バージョン以降に新たに追加された機能、インデックス条件プッシュです。

まず、プッシュするインデックス条件がない場合の処理​​フローについて説明します。

オプティマイザーが ICP を使用しない場合、データのアクセスと抽出のプロセスは次のようになります:

1) ストレージ エンジンは次の行を読み取るとき、最初にインデックス タプルを読み取り、次にそのインデックス タプルを使用してベース テーブル内のデータの行全体を見つけて読み取ります。
2) サーバー層は where 条件を評価し、データの行が where 条件を満たしている場合は使用され、そうでない場合は破棄されます。
3) 1)をデータの最終行まで実行します。

インデックス条件プッシュがある場合の処理​​フロー:

オプティマイザーが ICP を使用すると、サーバー層はインデックスを使用して評価できる where 条件をストレージ エンジン層にプッシュします。データのアクセスと抽出のプロセスは次のとおりです:

1) ストレージ エンジンは、インデックスから次のインデックス タプルを読み取ります。
2) ストレージ エンジンはインデックス タプルを使用して、プッシュダウン インデックス条件を評価します。 where 条件が満たされない場合、ストレージ エンジンは次のインデックス タプルを処理します (前のステップに戻ります)。インデクスタプルがプッシュダウンインデクス条件を満たす場合に限り、実表からのデータの読み込みが継続されます。
3) プッシュダウン インデックス条件が満たされる場合、ストレージ エンジンはインデックス タプルを通じてベース テーブルの行を見つけ、データの行全体を読み取り、サーバー層に返します。
4) サーバー層の評価はストレージ エンジン層の where 条件にプッシュダウンされず、データ行が where 条件を満たす場合は使用され、そうでない場合は破棄されます。

簡単に言えば、ICP がない場合、ストレージ エンジンは条件を満たすすべてのデータ行を返し、サービス層で where 条件フィルタリングを実行します。
ICP がある場合、where 条件はストレージ エンジン層にプッシュダウンされ、ストレージ エンジンは条件を満たすデータを直接返します。
パフォーマンスは当然大幅に向上します。

ICP の関連紹介については、ここでご覧いただけます

一時の使用は暗黙的な一時テーブルを意味します。これは、MySQL が中間データを保存するための一時テーブルを生成することを意味します。なぜなら、union all は別々に処理されて最後にマージされる関係だからです。
エクストラから、それはクエリのパフォーマンスが高いことも必要です。

全体: OR クエリのパフォーマンスは UNION ALL よりも優れているはずです。

データ量が増えるとすべてのクエリのパフォーマンスが変化するため、上記の分析は被験者が投稿したExplain分析結果に基づいています。これは、あらゆる状況において OR が UNION ALL よりも優れているというわけではありません。

上記は個人的な意見ですので、間違いがあればご指摘ください。

いいねを押す +0
黄舟

これら 2 つの文の間に違いはありません。
一般に、OR が 2 つの異なるフィールドを接続し、インデックスが使用できない場合、パフォーマンスが低下し、結合ほど良くありません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!