2010-11-29 14 views
0

タグを持つブログ投稿を含むデータベースがあり、タグ付きのブログ投稿を取得したいとします。私はまた、単一のクエリでそれを行うことができますしかしパフォーマンスのために複数のクエリの代わりに1つの結合クエリを使用しますか?

SELECT title, text, date 
    FROM POSTS 
WHERE id = 1 

SELECT tag 
    FROM TAGS 
WHERE post_id = 1 

私は2つのクエリを行うことができます

SELECT title, text, date, tag 
    FROM POSTS, TAGS 
WHERE posts.id = 1 
    AND tags.post_id = posts.id 

を、後者は少し無駄です、なぜなら、同じタイトル、テキスト、日付の列を、ブログ投稿のタグの何倍もの数だけ転送するからです。サーバーへのトリップは1回だけです。

重複データの転送を避ける後者のクエリの代替方法はありますか?それとも大したことではありません。とにかくそれを使用する必要があります。なぜなら、未使用の余分な数百バイトを転送するのは2つの別のクエリを作成するよりも安いからです。

+0

タグ値が結果セットを膨らませているように見えます。コンマで区切られたタグ値のリストのように、あなたのニーズに合ったフォーマットがありますか? –

+0

カンマで区切られたリストは、タグで投稿を一覧表示する場合はあまり効果的ではありません。 – Tom

答えて

2

MySQLの最適化はこれほど簡単ではありません。複雑な結合や集計が行われている場合、特に複数のクエリ(中間のテンポラリテーブルを持つ可能性があります)が単一のクエリよりもはるかに高速であることがあります。ですから、単一のクエリは常に高速になると想定しないでください。しかし

は、単一のクエリは、多くの場合、同じくらい速いか、複数のクエリよりも高速であり、それはあなたがはるかに簡潔にやっていることを表現しています。有線を横切るバイトの数を心配する必要はありませんが、それは他に起こっていることと比較して些細なことです。

2

むしろ、1回の投稿ごとの旅行よりも、サーバーへの1回の旅行をしてください。

私を信頼すれば、パフォーマンスが向上します。

データを取得する単一のクエリは、クライアントからサーバーへのラウンドトリップを使用するよりも、しばしば優れたソリューションです。

関連する問題