1

テーブルにデータを挿入する 2 つの MySQL クエリがあります。どちらも次の形式です。

CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
)
SELECT `field1`, `field2`
WHERE `active` = 1

2 つのクエリの唯一の違いは、 と が決定される方法field1field2、条件句の小さな違いです。どちらも最大 12K 以上のレコードを実行します。

さて、より効率的なものは次のとおりです。

A. 両方のクエリを別々に実行します。

if (mysql_query($query1)) {
    return mysql_query($query2);
}
return false;

B. OR 2 つのクエリを UNION で結合し、1 回実行します。

$query = 'SELECT `field1`, `field2` WHERE `active` = 1
            UNION 
            SELECT DO_ONE(`field1`), DO_TWO(`field2`) WHERE `active` = 1
            ORDER BY `field1`';
return mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
) ' . $query)

一方のクエリからのデータは、他方からのデータなしでは役に立たないため、両方が成功する必要があります。DO_ONEおよびDO_TWOは、いくつかの仕様に従ってフィールド データを変更するユーザー定義の MySQL 関数です。

4

3 に答える 3

1

Aaronmccall の回答は、一般的におそらく最良のものです。UNION アプローチは、1 回の SQL 呼び出しですべてを実行します。一般に、これは最も「効率的」ですが、特定のアプリケーションの「効率的」の尺度に影響を与える副次的な問題が発生する可能性があります。

具体的には、UNION で中間結果を収集するために一時テーブルが必要であり、非常に大きなデータ セットを操作している場合、新しいテーブルに対して 2 つの別々の単純な SELECT を実行すると、特定のケースではより効率的であることが判明する可能性があります。これは、データベース エンジン内の内部動作、実行された最適化などに依存します (使用しているデータベース エンジンのバージョンによって異なる可能性があります)。

最終的に、このような特定の質問に関する質問に答える唯一の方法は、特定のアプリケーションと環境のタイミングを行うことです。

また、2 つの別個のクエリと「オールインワン」クエリに必要な時間の差は、全体的なスキームでは重要ではない可能性があることを考慮したい場合もあります...おそらく、数ミリ秒 (またはマイクロ秒でも?) mysql データベースが別のサーバー上にあり、大きな遅延の問題がある場合を除きます。これらの呼び出しを 1 回で何千回も実行している場合、その差は大きいかもしれません。 2つはおそらく気付かれないでしょう。

---ローレンス

于 2009-05-15T17:42:56.620 に答える
0

あなたのオプションは異なることをします。最初のクエリが正しく実行された場合、最初のクエリは 2 番目のクエリの結果を返します (これは、返される結果とは無関係であり、空の行セットを返す可能性があります)。2 番目のクエリは、最初のクエリと 2 番目のクエリの結果をまとめて返します。最初のオプションは私にはかなり役に立たないようです。おそらく、あなたが達成したいのは、UNIONで行ったことです(私があなたを誤解していない限り)。

編集:あなたのコメントを読んだ後、私はあなたが次のようなものを求めていると思います:

SELECT true where (EXISTS(SELECT field1, field2 ...) AND EXISTS (SELECT Field1, field2 ...))。

そうすれば、DB へのクエリが 1 つだけになり、スケーリングが向上し、接続プールからのリソースが少なくなり、DB エンジンが別のサーバーにある場合にレイテンシの影響が 2 倍になることはありませんが、それでもクエリは中断されます。最初の条件が失敗した場合、これは、ネストされた分離されたクエリで探しているパフォーマンスの向上です。

最適化として、条件が同じでない場合に備えて、実行速度が速くなる条件を最初に設定してください。それらの1つがそれらのフィールド計算を必要とする場合、遅くなると思います。

于 2009-05-15T12:40:52.057 に答える