2009-10-13 6 views
5

J'ai une base de données MySQL dans laquelle chaque utilisateur a un compte, et chaque compte peut avoir plusieurs autorisations.Performance MySQL: Requête unique utilisant GROUP_CONCAT, ou deux requêtes distinctes?

Mon but ultime est de me retrouver avec le nom d'utilisateur du compte, et une liste d'identifiants d'autorisations délimitée par des virgules. Il y a deux façons que je peux accomplir cette tâche:

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 

... ou ...

SELECT username 
FROM account 
WHERE id = 1902; 

SELECT permission_id 
FROM account_permission 
WHERE account_id = 1902 

Avec la seule requête, je reçois mes résultats exactement comme je les veux. Avec deux requêtes, je dois créer la liste délimitée par des virgules dans l'application (PHP) en utilisant le second jeu de résultats.

Y a-t-il des raisons de performance de ne PAS choisir la première option? Je n'ai jamais utilisé GROUP_CONCAT auparavant, donc je ne connais pas les implications en termes de performances.

Répondre

6

La performance devrait être OK - mieux que deux requêtes. Vous devez être conscient que le length is limited si:

Le résultat est tronqué à la longueur maximale est donnée par la variable système group_concat_max_len, qui a une valeur par défaut de 1024. La valeur peut être plus élevé, bien que la La longueur maximale effective de la valeur de retour est limitée par la valeur de max_allowed_packet. La syntaxe pour modifier la valeur de group_concat_max_len lors de l'exécution est la suivante, où val est un entier non signé:

SET [GLOBAL | SESSION] group_concat_max_len = val; 
Questions connexes