2011-07-23 62 views
1

我是MySQL新手,正在使用它来管理书籍数据库。除了标准数据和描述之外,每本书还有一些其他的文本字段,这些字段可能取决于书本。例如,一本书可能有一些评论,链接等。使用group_concat的单个查询中的多个文本字段

我想我会把这些存储在一个book_id,字段类型(例如审查)和字段内容的表中。

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

这意味着我也必须确保我的分隔符字符已被转义,并且在获取数据后我不得不取消它。哪种方法对我更好?

谢谢!

+0

获取您需要的数据,并且不要尝试对数据库的查询策略进行第二次猜测。如果你有成千上万的记录,并且确实存在瓶颈,你可以考虑添加合适的索引。 –

+0

我没有把它说得很对,我想 - 这是我为一个网站创建的新数据库,所以我想以正确的方式开始。 –

+1

哦,好的。确保数据库已标准化。其他一切都将落实到位。不要试图在一个领域内实现你自己的迷你数据库。 –

回答

0

GROUP_CONCAT通常是简化报告的绝佳方式。但是对于包含大量文本的字段,这将很容易导致正确的截断数据(根据my.cnf设置group_concat_max_len在例如1024个字符后截断)。更糟糕的是,如果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) 
; 

PS纠正我,如果我错了关于MySQL如何从聚合查询缓存数据。

相关问题