2011-07-23 15 views
1

私はMySQLを初めて使い、これを使って本のデータベースを管理しています。各書籍には、標準的なデータと説明に加えて、その他のテキストフィールドがあり、書籍に依存する場合があります。例えば、本にはいくつかのレビュー、リンクなどがあるかもしれません。group_concatを使用した単一クエリ内の複数のテキストフィールド

私はbook_id、フィールドタイプ(例:レビュー)、およびフィールドの内容を持つテーブルにこれらを保存すると考えました。

私の問題は、1冊の書籍のすべてのデータを取得したときにクエリを最適化したいということです。 2番目のクエリですべての追加のテキストフィールドデータを取得するだけでも簡単です。しかし、group_concatを使用してこれらの追加のテキストフィールドを含むすべてのブック情報を1つのクエリで提供すると、パフォーマンスが大幅に向上しますか?

これは私のセパレータ文字がエスケープされていることを確認しなければならないことを意味し、データを取得した後にエスケープする必要があります。どちらのアプローチが私にとってうまくいくのでしょうか?

ありがとうございます!

+0

必要なデータを取得し、DBのクエリ方法を推測しないでください。何千ものレコードがあり、実際にボトルネックがある場合は、適切なインデックスを追加することについて考えることができます。 –

+0

私はそれを間違いなく置いていませんでした - これは私がウェブサイト用に作成した新しいデータベースなので、正しい方法で始めたいと思います。 –

+1

ああ、OK。データベースが正規化されていることを確認してください。他のすべてがその場に落ちるでしょう。フィールド内に独自のミニデータベースを実装しようとしないでください。 –

答えて

0

GROUP_CONCATは通常、レポートを簡単にする優れた方法です。しかし、多くのテキストを含むフィールドの場合、右切り捨てデータ(たとえば、my.cnf設定group_concat_max_lenに応じて、たとえば1024文字の後に切り捨てられます)に簡単につながります。さらに悪いことに、GROUP_CONCATされたフィールドがBLOB(TEXT、LONGTEXTなど)のタイプであれば、多くのRWがディスクに誘惑されます。ただし、GROUP_CONCATのフィールドがVARCHARまたはINTの場合は、複数回ではなく1回のクエリを使用してインデックスキャッシュデータから直接大きなレポートを作成することができ、パフォーマンスが向上する可能性があります。

例私はMySQLが集計クエリからのデータをキャッシュする方法について間違っている場合

SELECT 
    B.bookID, 
    B.bookTitle, 
    B.isbn, 
    GROUP_CONCAT(
     CONCAT(
      (IFNULL(R.review, "no reviews of this book")), 
      R.revierName) 
     ORDER BY R.stars 
     SEPARATOR "<br />" 
    ) AS reviews 
FROM books B 
LEFT JOIN reviews R ON (B.bookID = R.bookID) 
; 

PS私を修正。

関連する問題