12

2 つの単一クエリを 0.02 秒未満で実行するように最適化するとUNION、結果のクエリの実行に 1 秒以上かかります。また、UNION ALLは よりも時間がかかりますUNION DISTINCT

重複を許可すると、クエリの実行が速くなり、遅くはならないと思います。2 つのクエリを別々に実行したほうがよいのでしょうか? を使用することをお勧めしますUNION

私が行う場合の簡単な例として

SELECT name FROM t1 WHERE field1 = true

0.001秒かかります

もしそうなら

SELECT name FROM t1 WHERE field1 = false

0.1 秒かかります。

次に実行すると

SELECT name FROM t1 WHERE field1 = true 
UNION ALL 
SELECT name FROM t1 WHERE field1 = false

1秒以上かかります。

4

5 に答える 5

17

2 つの単一クエリを 0.02 秒未満で実行するように最適化し、それらを UNION すると、結果のクエリの実行に 1 秒以上かかります。

クエリにORDER BY … LIMIT句が含まれていますか?

ORDER BY … LIMITの後にを付けるUNIONと全体UNIONに適用され、この場合はインデックスを使用できません。

が主キーの場合id、このクエリは即座に実行されます。

SELECT  *
FROM    table
ORDER BY id
LIMIT 1

、しかしこれはしません:

SELECT  *
FROM    table
UNION ALL
SELECT  *
FROM    table
ORDER BY id
LIMIT 1

また、UNION ALLは よりも時間がかかりますUNION DISTINCT。重複を許可すると、クエリの実行が速くなり、遅くはならないと思います。

これも によるものと思われるORDER BY。小さいセットの並べ替えは、大きいセットよりも高速です。

2 つのクエリを別々に実行したほうがよいのでしょうか? 私はUNION

結果セットをソートする必要がありますか?

そうでない場合は、最後のORDER BY.

于 2009-05-16T00:36:09.450 に答える
4

推測: 1 つのテーブルを 2 つのユニオンでクエリするため、mysql がテーブルのロック戦略を決定するのが難しいか、いくつかのキャッシュを試行する可能性があります。アクセスをマルチスレッド化する(非常に合理的)が、ロック/同時実行/ファイルシークの問題が発生する..

これら 2 つの選択は一貫している必要があるため、共用体は通常、より高い安全設定を採用することもあります。それらを別々のトランザクションに入れると、そうではありません。

実験: テーブルの複製を作成し、それらを結合します。私が正しければ、それはより速いはずです。

可能な解決策: 単一のファイルを複数のファイルに分割して、より優れた同時実行戦略を可能にします。これは、ロックの問題には役立ちません/役に立ちませんが、データベースのマルチスレッド/シークの問題を除外します。

どのストレージ エンジンを使用しているかを知っておくと便利です。

ちょうど私の2セント。現在、ここでこれをテストすることはできません。

于 2009-05-15T18:48:18.460 に答える
-1

すべてのデータを取得する時間ではなく、応答時間を測定している可能性はありますか?

于 2009-09-16T10:08:29.797 に答える