Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lý do không sử dụng GROUP_CONCAT?

  • Sử dụng GROUP_CONCAT () thường gọi logic từng nhóm và tạo các bảng tạm thời, thường là một tiêu cực lớn cho hiệu suất. Đôi khi bạn có thể thêm chỉ mục phù hợp để tránh bảng tạm thời trong một truy vấn theo nhóm, nhưng không phải trong mọi trường hợp.

  • Như @MarcB đã chỉ ra, giới hạn độ dài mặc định của một chuỗi được nối nhóm là khá ngắn và nhiều người đã bị nhầm lẫn bởi danh sách bị cắt ngắn. Bạn có thể tăng giới hạn bằng group_concat_max_len .

  • Việc giải phóng một chuỗi thành một mảng trong PHP không miễn phí. Chỉ vì bạn có thể làm điều đó trong một lệnh gọi hàm trong PHP không có nghĩa là nó là tốt nhất cho hiệu suất. Tôi chưa đánh giá sự khác biệt, nhưng tôi nghi ngờ bạn cũng có.

  • GROUP_CONCAT () là một MySQLism. Nó không được hỗ trợ rộng rãi bởi các sản phẩm SQL khác. Trong một số trường hợp (ví dụ:SQLite), chúng có hàm GROUP_CONCAT (), nhưng nó không hoạt động hoàn toàn giống như trong MySQL, vì vậy điều này có thể dẫn đến lỗi khó hiểu nếu bạn phải hỗ trợ nhiều RDBMS back-end. Tất nhiên, nếu bạn không cần lo lắng về việc chuyển, đây không phải là vấn đề.

  • Nếu bạn muốn tìm nạp nhiều cột từ currencies của mình thì bạn cần nhiều biểu thức GROUP_CONCAT (). Các danh sách có được đảm bảo theo cùng một thứ tự không? Tức là, trường thứ ba trong một danh sách có tương ứng với trường thứ ba trong danh sách tiếp theo không? Câu trả lời là không - không trừ khi bạn chỉ định đơn hàng với ORDER BY mệnh đề bên trong GROUP_CONCAT ().

Tôi thường ưu tiên định dạng mã đầu tiên của bạn, sử dụng tập hợp kết quả thông thường và lặp lại các kết quả, lưu vào một mảng mới được lập chỉ mục bởi id khách hàng, nối các đơn vị tiền tệ vào một mảng. Đây là một giải pháp đơn giản, giữ cho SQL đơn giản và dễ tối ưu hóa hơn và hoạt động tốt hơn nếu bạn có nhiều cột để tìm nạp.

Tôi không cố nói GROUP_CONCAT () là xấu! Nó thực sự hữu ích trong nhiều trường hợp. Nhưng cố gắng thực hiện bất kỳ quy tắc một kích thước phù hợp với tất cả để sử dụng (hoặc tránh) bất kỳ tính năng ngôn ngữ hoặc chức năng nào là đơn giản.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Scala Spark loại missmatch tìm thấy Đơn vị, bắt buộc rdd.RDD

  2. Dấu thời gian không có thay đổi khi cập nhật

  3. Mật khẩu mặc định của mysql trong máy chủ ubuntu 16.04

  4. Codeigniter hiển thị trang trống không có lỗi

  5. Chuyển kết quả cơ sở dữ liệu thành mảng