Производительность MySQL: один запрос с использованием GROUP_CONCAT или два отдельных запроса? - PullRequest
6 голосов
/ 13 октября 2009

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

Моя конечная цель - получить имя пользователя учетной записи и список идентификаторов разрешений через запятую. Есть два способа сделать это:

SELECT a.username, GROUP_CONCAT(rp.permission_id) as permission_ids
FROM account AS a
JOIN role_permission AS rp
ON rp.role_id = a.role_id
WHERE a.id = 1902

... или ...

SELECT username
FROM account
WHERE id = 1902;

SELECT permission_id
FROM account_permission
WHERE account_id = 1902

С помощью одного запроса я получаю свои результаты именно так, как я хочу. С помощью двух запросов мне нужно создать в приложении список с разделителями-запятыми (PHP), используя второй набор результатов.

Есть ли какие-либо причины для производительности, чтобы НЕ выбрать первый вариант? Я никогда раньше не использовал GROUP_CONCAT, поэтому не знаю, как это повлияет на производительность.

1 Ответ

7 голосов
/ 13 октября 2009

Производительность должна быть в порядке - лучше, чем два запроса. Вы должны знать, что длина ограничена , хотя:

Результат усекается до максимальной длины, заданной системной переменной group_concat_max_len , значение по умолчанию которой равно 1024. Значение может быть установлено выше, хотя эффективная максимальная длина возвращаемого значения ограничено значением max_allowed_packet. Синтаксис для изменения значения group_concat_max_len во время выполнения выглядит следующим образом, где val - целое число без знака:

SET [GLOBAL | SESSION] group_concat_max_len = val;
...