使用group_concat在单个查询中的多个文本字段

时间:2011-07-23 15:50:05

标签: mysql sql text field group-concat

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

我以为我会将这些存储在包含book_id,字段类型(例如评论)和字段内容的表中。

现在,我的问题是,当我获得一本书的所有数据时,我想优化查询。使用第二个查询获取所有其他文本字段数据非常简单。但是,如果我使用group_concat在单个查询中向我提供所有书籍信息(包括这些附加文本字段),是否会有显着的性能提升?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

GROUP_CONCAT通常是一种简化报告的好方法。但对于包含大量文本的字段,这很容易导致右截断数据(例如1024个字符后切断,具体取决于您my.cnf设置group_concat_max_len)。更糟糕的是,如果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会纠正我。