Tôi sẽ viết truy vấn như sau:
SELECT c.time
, SUM(c.counter)
, MAX(p.clustername) AS clustername
FROM cell c
JOIN swap_plan p
ON p.siteid = c.siteid
AND p.clustername = 'Cluster A'
WHERE c.time >= 'day1'
AND c.time <= 'day2'
GROUP
BY c.time
Tôi chắc chắn có một chỉ mục trên cell
với time
làm cột hàng đầu.
MySQL có thể sử dụng cùng một chỉ mục để đáp ứng vị từ phạm vi (trong mệnh đề WHERE) và để đáp ứng GROUP BY mà không cần thao tác "Sử dụng tệp tin".
... ON cell (time)
Tùy thuộc vào kích thước của các cột, chỉ mục bao trùm có thể mang lại hiệu suất tối ưu. Chỉ mục bao gồm tất cả các cột từ bảng được tham chiếu trong truy vấn, do đó, truy vấn có thể được đáp ứng hoàn toàn từ các trang chỉ mục mà không cần tra cứu các trang trong bảng bên dưới.
... ON cell (time, siteid, counter)
Đối với chỉ mục trên swap_plan
, Tôi muốn có một chỉ mục với site_id
là cột hàng đầu và bao gồm clustername
cột, một trong số:
... ON swap_plan (clustername, site_id)
hoặc
... ON swap_plan (site_id, clustername)
Có vẻ như sẽ có một ràng buộc DUY NHẤT đối với sự kết hợp của hai cột đó, tức là các giá trị của site_id
sẽ khác biệt đối với một clustername
nhất định . (Nếu không đúng như vậy và (site_id,clustername)
giống nhau tuple xuất hiện nhiều lần, có khả năng tổng cộng của counter
được thổi phồng.
Tôi đang tìm EXPLAIN
đầu ra để hiển thị tra cứu 'ref' tới swap_plan
bảng từ giá trị của c.siteid
và giá trị const (nghĩa đen là 'Cụm A') cho tên cụm.
Với các bảng có kích thước 31 hàng và 368 hàng, chúng ta sẽ không thấy sự khác biệt đáng kể về hiệu suất (thời gian đã trôi qua) giữa một kế hoạch thực thi tối ưu và một kế hoạch thực thi khủng khiếp.
Khi một trong hai bảng có quy mô lên đến hàng triệu hàng, đó là lúc sự khác biệt sẽ trở nên rõ ràng. Lựa chọn kế hoạch thực thi của trình tối ưu hóa bị ảnh hưởng bởi số liệu thống kê (kích thước, số hàng, số lượng cột) của mỗi bảng, do đó, kế hoạch thực thi có thể thay đổi khi kích thước bảng tăng lên.