1

我是 MySQL 新手,正在使用它来管理书籍数据库。每本书除了标准数据和描述外,还有一些杂项文本字段,这可能取决于书。例如,一本书可能有一些评论、链接等。

我想我会将它们存储在带有 book_id、字段类型(例如评论)和字段内容的表中。

现在,我的问题是,当我获得一本书的所有数据时,我想优化查询。使用第二个查询获取所有额外的文本字段数据就足够简单了。但是,如果我使用 group_concat 在单个查询中为我提供所有书籍信息(包括这些额外的文本字段),是否会显着提高性能?

这意味着我还必须确保我的分隔符被转义,并且在获取数据后我必须取消它。哪种方法更适合我?

谢谢!

4

1 回答 1

0

GROUP_CONCAT 通常是一种使报告更容易的好方法。但是对于包含大量文本的字段,这很容易导致正确的截断数据(例如 1024 个字符后截断,具体取决于您的 my.cnf 设置 group_concat_max_len )。更糟糕的是,如果 GROUP_CONCAT'ed 的字段是 BLOB 类型(TEXT、LONGTEXT 等),则会有很多 RW 作为临时表写入磁盘。但是,如果您 GROUP_CONCAT'ing 的字段是 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 如何缓存来自聚合查询的数据有误,请纠正我。

于 2012-02-17T15:16:27.017 回答