2009-10-13 30 views
5

Tôi có cơ sở dữ liệu MySQL, trong đó mỗi người dùng có một tài khoản và mỗi tài khoản có thể có nhiều quyền.Hiệu suất MySQL: Truy vấn đơn lẻ bằng cách sử dụng GROUP_CONCAT hoặc hai truy vấn riêng biệt?

Mục tiêu cuối cùng của tôi là kết thúc bằng tên người dùng của tài khoản và danh sách các id quyền hạn được phân cách bằng dấu phẩy. Có hai cách tôi có thể thực hiện điều này:

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 

... hoặc ...

SELECT username 
FROM account 
WHERE id = 1902; 

SELECT permission_id 
FROM account_permission 
WHERE account_id = 1902 

Với truy vấn duy nhất, tôi nhận được kết quả của tôi chính xác như tôi muốn họ. Với hai truy vấn, tôi phải tạo danh sách được phân tách bằng dấu phẩy trong ứng dụng (PHP) bằng cách sử dụng tập kết quả thứ hai.

Có bất kỳ lý do hiệu suất nào KHÔNG chọn tùy chọn đầu tiên không? Tôi chưa bao giờ sử dụng GROUP_CONCAT trước đây, vì vậy tôi không biết các tác động của nó, hiệu quả-khôn ngoan.

Trả lời

6

Hiệu suất phải OK - tốt hơn hai truy vấn. Bạn cần lưu ý rằng mặc dù length is limited:

Kết quả được cắt ngắn với độ dài tối đa mà được cho bởi biến group_concat_max_len hệ thống, trong đó có một giá trị mặc định là 1024. Giá trị có thể được thiết lập cao hơn, mặc dù chiều dài tối đa hiệu dụng của giá trị trả về bị hạn chế bởi giá trị của max_allowed_packet. Cú pháp để thay đổi giá trị của group_concat_max_len tại thời gian chạy là như sau, trong đó val là một số nguyên không dấu:

SET [GLOBAL | SESSION] group_concat_max_len = val; 
Các vấn đề liên quan