2017-11-19 6 views
1

たとえば、問題を説明するために簡略化した例を使用して、コメントのページを表示したいと思います。また、コメントが属するエンティティのタイトルも表示したいと思います。MySQLは膨大なクエリで同じデータをネットワーク経由で転送することを避けていますか?

Iは、2つのクエリを行うことができる。

select title from entities where id = 1 
select column1, column2 from comments where entity = 1 

または私は(私が好む)ネットワーク呼び出しを最小化するために1つのクエリを実行できます。結果セットは勿論である。後者の場合には

select title, column1, column2 from entities, comments where id = 1 and entity = id 

をすべての行が1回だけ必要な同じエンティティタイトルを持つため、膨らませます。

同じことを複数回転送するのは無駄です。この場合、MySQLは返されたデータを最適化し、ネットワーク上でタイトルデータを1回だけ転送します(そして、クライアント上の結果セットを再構築します)?それとも、ネットワークデータに何回返された行があるのでしょうか?

+0

あなたの2番目の質問は間違っています。あなたはテーブルを結合しています –

+0

あなたはいくつかの情報を選択しているようです..フィールドの数がこれであれば、2つではなく1つのクエリに対してかなりの利点がありません – scaisEdge

+0

@scaisEdge実際のクエリでは、より多くのデータが選択された質問を説明する例は – Tom

答えて

3

いいえ、MySQLはデフォルトで結果セットを最適化しませんが、これを実装することはできます(公式はコメントとしてコメントを出します)。さまざまなネットワーク通信層の中の何かがデータを圧縮する可能性はありますが、それは珍しいことです。

あなたの所見は良い観察です。時には、複数のクエリがより効率的です。なぜなら、データのやりとりが少ないという単純な理由からです。クエリのコンパイルと実行のオーバーヘッドは、数バイトのデータを返す努力に比べて大きいため、データサイズの違いは、2つのクエリのメソッドが顕著に優れている必要があります。

2番目のクエリは、より適切に書かれたとして、次のようになります。明示的なの使用が参加

select e.title, c.column1, c.column2 
from entity e join 
    comments c 
    on e.id = c.entity 
where e.id = 1 and entity = id; 

注、表の別名、および修飾された列名。

+2

で示したように、MySQLは圧縮されたクライアント/サーバプロトコルを提供します。 MySQLクライアントは、接続文字列で 'Compress = true'を指定してこれを要求できます。私の経験では、このZLIB圧縮は、JOIN操作の大きな結果セットに固有のデータ複製におけるトラフィックの膨らみをやや緩和します。 @ O.Jones。 –

+0

。 。 。その情報をありがとう。 OPが尋ねているように、レコード間で動作することもわかります。 –

+0

通常、zlibはテキスト3:1を圧縮します。しかし、結果セットの冗長性により、より良い圧縮が得られる可能性があります。 –

関連する問題