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

Làm cách nào để tối ưu hóa truy vấn MySQL này? Hàng triệu hàng

Tôi sẽ tạo các chỉ mục sau (chỉ mục b-cây):

Các giao dịch
analytics(user_id, source, id) 
transactions(analytics, status)

Điều này khác với gợi ý của Gordon.

Thứ tự của các cột trong chỉ mục là quan trọng.

Bạn lọc theo analytics.user_id cụ thể , vì vậy trường này phải là trường đầu tiên trong chỉ mục. Sau đó, bạn nhóm theo analytics.source . Để tránh sắp xếp theo source đây sẽ là trường tiếp theo của chỉ mục. Bạn cũng tham khảo analytics.id , vì vậy tốt hơn nên có trường này như một phần của chỉ mục, hãy đặt nó cuối cùng. MySQL có khả năng chỉ đọc chỉ mục và không chạm vào bảng không? Tôi không biết, nhưng nó khá dễ kiểm tra.

Lập chỉ mục về transactions phải bắt đầu với analytics , bởi vì nó sẽ được sử dụng trong JOIN . Chúng tôi cũng cần status .

SELECT 
    analytics.source AS referrer, 
    COUNT(analytics.id) AS frequency, 
    SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094 
GROUP BY analytics.source 
ORDER BY frequency DESC 
LIMIT 10 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi khóa ngoại MySQL 1005 errno 150 khóa chính làm khóa ngoại

  2. Muốn giới hạn giá trị của một trường MySQL trong phạm vi cụ thể (Giá trị thập phân)

  3. Sử dụng lại Truy vấn con từ Biểu thức Chọn trong Mệnh đề WHERE

  4. MySQL nhận biết và cập nhật tối đa trong một truy vấn

  5. Hợp nhất 2 bảng cho một truy vấn CHỌN?