2009-10-13 11 views
5

Tengo una base de datos MySQL en la que cada usuario tiene una cuenta, y cada cuenta puede tener múltiples permisos.Rendimiento de MySQL: ¿Una sola consulta usando GROUP_CONCAT, o dos consultas separadas?

Mi objetivo final es terminar con el nombre de usuario de la cuenta y una lista delimitada por comas de identificadores de permisos. Hay dos maneras en que puedo lograr esto:

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 

... o ...

SELECT username 
FROM account 
WHERE id = 1902; 

SELECT permission_id 
FROM account_permission 
WHERE account_id = 1902 

Con la sola consulta, consigo mis resultados exactamente como yo los quiero. Con dos consultas, tengo que crear la lista delimitada por comas en la aplicación (PHP) utilizando el segundo conjunto de resultados.

¿Hay alguna razón de rendimiento para NO elegir la primera opción? Nunca antes había usado GROUP_CONCAT, así que no sé las implicaciones de esto, en cuanto a rendimiento.

Respuesta

6

El rendimiento debería ser correcto, mejor que dos consultas. Tienes que ser consciente de que el length is limited sin embargo:

El resultado se trunca a la longitud máxima que se da por la variable group_concat_max_len sistema, que tiene un valor predeterminado de 1024. El valor puede ser mayor, aunque la la longitud máxima efectiva del valor de retorno está restringida por el valor de max_allowed_packet. La sintaxis para cambiar el valor de group_concat_max_len en tiempo de ejecución es el siguiente, donde val es un entero sin signo:

SET [GLOBAL | SESSION] group_concat_max_len = val; 
Cuestiones relacionadas