1

私は MySQL を初めて使用し、書籍のデータベースを管理するために使用しています。各本には、標準のデータと説明に加えて、本によって異なるいくつかのその他のテキスト フィールドがあります。たとえば、本にはいくつかのレビューやリンクなどが含まれている場合があります。

これらを、book_id、フィールドの種類 (レビューなど)、およびフィールドの内容を含むテーブルに格納すると考えました。

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

これは、区切り文字がエスケープされていることも確認する必要があり、データを取得した後にエスケープを解除する必要があることを意味します。どのアプローチが私にとってより効果的でしょうか?

ありがとう!

4

1 に答える 1

0

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

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)
;

MySQLが集約されたクエリからデータをキャッシュする方法について間違っている場合は、PSが修正します。

于 2012-02-17T15:16:27.017 に答える