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

Chỉ số nào để cải thiện hiệu suất của JOIN và GROUP BY

Mẹo chuyên nghiệp Tránh SELECT * hoặc SELECT table.* trong các truy vấn nhạy cảm với hiệu suất. Thay vào đó, hãy chọn, theo tên, các cột bạn thực sự cần sử dụng

Mẹo chuyên nghiệp MySQL có một phần mở rộng không chuẩn nổi tiếng là GROUP BY mà bạn đang sử dụng và có thể sử dụng sai. Đọc này. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html Nếu bạn đã làm theo mẹo chuyên nghiệp đầu tiên, thì việc làm theo mẹo thứ hai sẽ dễ dàng hơn nhiều.

Mẹo chuyên nghiệp Tránh "ném vào" nhiều chỉ mục cột đơn với hy vọng đẩy nhanh các truy vấn của bạn. Thay vào đó, hãy tạo các chỉ mục, thường là các chỉ mục ghép, phù hợp với nhu cầu của truy vấn thực tế của bạn. Đọc https://use-the-index-luke.com này .

Mẹo chuyên nghiệp Using temporary; using filesort xuất hiện trong đầu ra EXPLAIN không nhất thiết là xấu. Nó chỉ đơn giản có nghĩa là công cụ truy vấn phải lưu vào bộ nhớ cache một phần kết quả trước khi trả về. temporary thứ không phải là một bảng thực tế, nó là một cấu trúc RAM. Nếu nó quá lớn, nó sẽ chiếm dụng RAM, MySQL sẽ tràn nó ra đĩa. Nhưng của bạn thì không.

Tất cả những gì đang được nói, hãy cấu trúc lại truy vấn của bạn. Tôi đoán bạn muốn truy xuất các hàng có idCartDATA lớn nhất giá trị cho mỗi CartSplitData.SUPPLIERID .

Vì vậy, hãy viết nó dưới dạng một truy vấn con.

                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID

Truy vấn này có thể được đẩy nhanh đáng kể, bằng cách đặt một chỉ mục kết hợp trên CartSplitData:(SUPPLIERID, IDCartDATA) .

Tiếp theo, hãy viết lại truy vấn chính của bạn để tìm các hàng khớp với id trong truy vấn con đó.

SELECT CartData.*             /* * hammers performance */
       CartSplitData.*        /* * hammers performance */
  FROM CartData
  JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
  JOIN (
                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID
       )x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
         AND x.IDCartData = CartSplitData.IDCartData
 WHERE CartData.CartOrderref = 'XXXXXXXXX'

Chỉ mục của bạn trên CartData.CartOrderref sẽ giúp ích cho truy vấn bên ngoài này, cũng như chỉ mục kết hợp được tạo ^^^.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi màu phông chữ nhận xét trong truy vấn MySQL Workbench

  2. lỗi khóa ngoại mysql # 1452

  3. Truy vấn MySQL cho nhiều giá trị hộp kiểm

  4. Nhóm các trang từ một cột

  5. MySQL nhận "gửi dữ liệu" mãi mãi. Truy vấn đơn giản, nhiều dữ liệu