2009-10-13 9 views
5

Mam bazę danych MySQL, w której każdy użytkownik ma konto, a każde konto może mieć wiele uprawnień.Wydajność MySQL: pojedyncze zapytanie przy użyciu GROUP_CONCAT lub dwa osobne zapytania?

Moim ostatecznym celem jest podanie nazwy użytkownika konta i rozdzielenie przecinkami listy identyfikatorów uprawnień. Istnieją dwa sposoby, można to osiągnąć:

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 

... lub ...

SELECT username 
FROM account 
WHERE id = 1902; 

SELECT permission_id 
FROM account_permission 
WHERE account_id = 1902 

z jednolitym zapytania, otrzymuję moje wyniki dokładnie tak, jak ja chcę. Przy dwóch zapytaniach muszę utworzyć listę rozdzielaną przecinkami w aplikacji (PHP) za pomocą drugiego zestawu wyników.

Czy są jakieś powody, aby NIE wybrać pierwszej opcji? Nigdy wcześniej nie korzystałem z GROUP_CONCAT, więc nie znam jego konsekwencji, pod względem wydajności.

Odpowiedz

6

Wydajność powinna być OK - lepsza niż dwa zapytania. Trzeba mieć świadomość, że choć length is limited:

Rezultatem jest obcięty do maksymalnej długości, który jest podany w zmiennej systemowej group_concat_max_len, który ma domyślną wartość 1024. Wartość ta może być wyższa, chociaż efektywna maksymalna długość zwracanej wartości jest ograniczona przez wartość max_allowed_packet. Składnia zmienić wartość group_concat_max_len na czas pracy jest następujący, Val całkowitą bez znaku:

SET [GLOBAL | SESSION] group_concat_max_len = val; 
Powiązane problemy