Tôi đang chạy một truy vấn mà trông như thế nàySử dụng một chỉ mục trong MySQL JOIN với OR trạng
SELECT parent.field, child.field
FROM parent
JOIN child ON (child.id = parent.id
OR child.id = parent.otherid)
Đây là tuy nhiên rất chậm (khoảng 100k hồ sơ, và tham gia vào các bảng khác trong phiên bản thực tế), nhưng mặc dù đã thử lập chỉ mục trên
parent.id (PRIMARY),
parent.otherid,
child.id (PRIMARY),
and a composite index of parent.id and parent.otherid
Tôi không thể sử dụng bất kỳ chỉ mục nào trong số các chỉ mục này khi tham gia.
Tôi đọc rằng MySQL chỉ có thể sử dụng một chỉ mục cho mỗi lần tham gia, nhưng không thể tìm thấy bất cứ nơi nào cho dù nó có thể sử dụng chỉ mục tổng hợp khi JOIN có chứa điều kiện OR.
Có ai ở đây biết liệu có thể làm cho truy vấn này tham chiếu đến chỉ mục không? Nếu có, làm thế nào?
GIẢI PHÁP CỦA TÔI
(SO sẽ không cho phép tôi trả lời câu hỏi của riêng tôi dưới đây atm)
Một loạt các tinh chỉnh và đã đưa ra một giải pháp khá phong nha mà vẫn giữ được khả năng JOIN và tổng hợp các bảng khác.
SELECT parent.field, child.field
FROM parent
JOIN (
SELECT parent.id as parentid,
# Prevents the need to union
IF(NOT ISNULL(parent.otherid) AND parent.otherid <> parent.id,
parent.otherid,
parent.id) as getdataforid
FROM parent
WHERE (condition)
) as foundrecords
ON foundrecords.parentid = parent.id
JOIN child ON child.id = parent.getdataforid
Đối với tốc độ đòi hỏi một điều kiện bên trong subquery để giảm số lượng các hồ sơ đặt trong một bảng tạm thời, nhưng tôi có tấn phụ gia nhập vào truy vấn bên ngoài, một số tham gia cho đứa trẻ và một số để phụ huynh (với một số tập hợp) vì vậy điều này làm việc tốt nhất cho tôi.
Trong nhiều trường hợp, công đoàn sẽ nhanh hơn và hiệu quả hơn, nhưng vì tôi lọc theo cấp độ gốc, nhưng muốn có dữ liệu bổ sung từ trẻ em (tự tham khảo cha mẹ), công đoàn đã tạo thêm hàng cho tôi hợp nhất. Có thể kết quả tương tự có thể được tìm thấy chỉ bằng cách tham gia cha mẹ với chính nó và đánh dấu một điều kiện trong truy vấn bên ngoài, nhưng điều này hoạt động khá độc đáo đối với tôi.
Nhờ Jirka cho UNION ALL gợi ý, đó là những gì thúc đẩy tôi đến đây :)
Cậu chạy 'giải thích chọn ... 'trên truy vấn? –
yep, giải thích là những gì cho tôi biết nó không sử dụng bất kỳ chỉ mục nào cho việc tham gia này. –