tôi là hợp lý mới cho MySQL và tôi đang cố gắng để chọn một tập hợp riêng biệt của hàng bằng tuyên bố này:CHỌN tuyên bố DISTINCT trong MySQL đang 10 phút
SELECT DISTINCT sp.atcoCode, sp.name, sp.longitude, sp.latitude
FROM `transportdata`.stoppoints as sp
INNER JOIN `vehicledata`.gtfsstop_times as st ON sp.atcoCode = st.fk_atco_code
INNER JOIN `vehicledata`.gtfstrips as trip ON st.trip_id = trip.trip_id
INNER JOIN `vehicledata`.gtfsroutes as route ON trip.route_id = route.route_id
INNER JOIN `vehicledata`.gtfsagencys as agency ON route.agency_id = agency.agency_id
WHERE agency.agency_id IN (1,2,3,4);
Tuy nhiên, báo cáo kết quả lựa chọn là dùng khoảng 10 phút, vì vậy một cái gì đó rõ ràng là bắt đầu.
Một yếu tố quan trọng là bảng gtfsstop_times
là rất lớn. (~ 250 triệu bản ghi)
Các chỉ mục dường như được thiết lập đúng cách; tất cả các phép nối trên đều sử dụng các cột được lập chỉ mục. Kích thước bảng là, khoảng:
gtfsagencys - 4 rows
gtfsroutes - 56,000 rows
gtfstrips - 5,500,000 rows
gtfsstop_times - 250,000,000 rows
`transportdata`.stoppoints - 400,000 rows
Máy chủ có 22Gb bộ nhớ, tôi đã đặt nhóm đệm InnoDB thành 8G và tôi đang sử dụng MySQL 5.6.
Ai có thể xem cách làm cho hoạt động này chạy nhanh hơn không? Hoặc thực sự, ở tất cả!
Có vấn đề gì khi bảng điểm dừng trong một lược đồ khác?
EDIT: GIẢI THÍCH SELECT ... trả về này:
Điều này thực hiện như thế nào nếu bạn bỏ qua vòng loại 'DISTINCT'? Bạn nhận được gì khi sử dụng 'GIẢI THÍCH' trên truy vấn? –
Kế hoạch giải thích là gì? Dán nó vào pastebin hoặc một gist –
Tôi không chắc chắn làm thế nào tôi sẽ kiểm tra rằng, vì nếu tôi bỏ qua vòng loại thì khoảng 250 triệu hàng sẽ được trả về. Xin lỗi nếu điều này có vẻ như vô nghĩa, tôi là một chút mới để thử nghiệm/gỡ lỗi truy vấn. –