Chỉ mục
-
Bạn cần - ít nhất là - một chỉ mục trên mọi trường được sử dụng trong
JOIN
điều kiện. -
Chỉ mục trên các trường xuất hiện trong
WHERE
hoặcGROUP BY
hoặcORDER BY
hầu hết thời gian cũng hữu ích. -
Khi trong một bảng, hai hoặc nhiều trường được sử dụng trong JOIns (hoặc WHERE hoặc GROUP BY hoặc ORDER BY), một chỉ mục phức hợp (kết hợp) của (hai hoặc nhiều) trường này có thể tốt hơn các chỉ mục riêng biệt. Ví dụ trong
SiteNumbers
bảng, các chỉ mục có thể có là kết hợp(number_accountid, number_active)
hoặc(number_active, number_accountid)
. -
Điều kiện trong các trường Boolean (BẬT / TẮT, hoạt động / không hoạt động) đôi khi làm chậm các truy vấn (vì các chỉ mục không được chọn lọc và do đó không hữu ích lắm). Tái cấu trúc (chuẩn hóa cha) các bảng là một tùy chọn trong trường hợp đó nhưng có lẽ bạn có thể tránh được sự phức tạp thêm vào.
Bên cạnh lời khuyên thông thường (kiểm tra kế hoạch GIẢI THÍCH, thêm chỉ mục nếu cần, kiểm tra các biến thể của truy vấn),
Tôi nhận thấy rằng trong truy vấn của bạn có một phần Sản phẩm Descartes. Bảng Accounts
có mối quan hệ một-nhiều với ba bảng FTPDetails
, SiteNumbers
và PPC
. Điều này có tác dụng là nếu bạn có ví dụ:1000 tài khoản và mọi tài khoản đều liên quan đến, chẳng hạn như 10 FTPDetails, 20 SiteNumbers và 3 PPC, truy vấn sẽ trả về cho mỗi tài khoản 600 hàng (tích 10x20x3). Trong tổng số 600 nghìn hàng có nhiều dữ liệu được trùng lặp.
Thay vào đó, bạn có thể chia truy vấn thành ba cộng một cho dữ liệu cơ sở (Tài khoản và các bảng còn lại). Theo cách đó, chỉ 34K hàng dữ liệu (có độ dài nhỏ hơn) sẽ được truyền:
Accounts JOIN Clients JOIN Users
(with all fields needed from these tables)
1K rows
Accounts JOIN FTPDetails
(with Accounts.account_id and all fields from FTPDetails)
10K rows
Accounts JOIN SiteNumbers
(with Accounts.account_id and all fields from SiteNumbers)
20K rows
Accounts JOIN PPC
(with Accounts.account_id and all fields from PPC)
3K rows
và sau đó sử dụng dữ liệu từ 4 truy vấn ở phía máy khách để hiển thị thông tin kết hợp.
Tôi sẽ thêm các chỉ mục sau:
Table Accounts
index on (account_designer)
index on (account_client)
index on (account_active, account_id)
index on (account_update)
Table FTPDetails
index on (ftp_active, ftp_accountid)
Table SiteNumbers
index on (number_active, number_accountid)
Table PPC
index on (ppc_active, ppc_accountid)