Несколько текстовых полей в одном запросе с использованием group_concat - PullRequest
1 голос
/ 23 июля 2011

Я новичок в MySQL и использую его для управления базой данных книг. В каждой книге, помимо стандартных данных и описания, есть несколько разных текстовых полей, которые могут зависеть от книги. Например, в книге может быть несколько обзоров, ссылок и т. Д.

Я думал, что сохраню их в таблице с book_id, типом поля (например, обзор) и содержимым поля.

Теперь моя проблема в том, что когда я получу все данные для одной книги, я бы хотел оптимизировать запрос. Было бы достаточно просто получить все дополнительные данные текстового поля с помощью второго запроса. Однако был бы значительный выигрыш в производительности, если бы я использовал group_concat, чтобы дать мне всю информацию о книге, включая эти дополнительные текстовые поля, в одном запросе?

Это означает, что мне также нужно убедиться, что мой символ-разделитель экранирован, и мне придется удалить его после получения данных. Какой подход будет работать лучше для меня?

Спасибо!

1 Ответ

0 голосов
/ 17 февраля 2012

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

PS поправьте меня, если я ошибаюсь в том, как MySQL кеширует данные из агрегированных запросов.

...