2011-01-14 3 views
5

Trong this O'Reilly presentation, có một đoạn giới thiệu một số khái niệm then chốt cho sự hiểu biết của MySQL giải thích:vòng lồng nhau trong MySQL

một là gì THAM GIA?

  • Tất cả mọi thứ là một JOIN, vì MySQL luôn luôn sử dụng lồng nhau-vòng
  • Ngay cả một đơn bảng CHỌN hoặc một UNION hoặc một subquery

bất cứ ai có thể giải thích cách làm việc này cho một đơn bảng SELECT?

Trả lời

2

Nested vòng là một cách để chế biến tham gia:

for each row of table A 
    if this row matches where clauses 
    for each row of joined table B 
     if this row matches where clauses and join clauses 
     accept row 
     end 
    end 
    end 
end 

Điều đó có thể được tối ưu hóa với chỉ số khá một chút, bằng cách làm "cho mỗi hàng tìm thấy tại chìa khóa K ở một số chỉ số" thay vì "mỗi dãy bảng A ", và giống với bảng B.

Trình bày đang nói đây là cách duy nhất để MySQL xử lý các phép nối. Có những phương pháp khác hơn có thể được sử dụng, nhưng MySQL không thực hiện chúng. Mục nhập OraFAQ này cung cấp một số thông tin mà Oracle thực hiện: http://www.orafaq.com/tuningguide/join%20methods.html Tương tự: http://oracle-online-help.blogspot.com/2007/03/nested-loops-hash-join-and-sort-merge.html

"Mọi thứ đều tham gia" chỉ là chi tiết triển khai, tôi tin. Không thực sự quan trọng.

+0

Tôi đã hỏi về SINGLE TABLE chọn trên MySQL để câu trả lời của bạn không áp dụng. Bạn có thể nghĩ rằng đó là "không thực sự quan trọng" nhưng tôi làm. Tôi vẫn muốn câu trả lời * của tôi * trả lời. – RADA

+0

@RADA: Tôi không chắc chính xác cách MySQL chuyển đổi một bảng chọn thành một tham gia. Có lẽ nó tham gia nó vào một bảng giả với một hàng, hoặc trái tham gia vào một bảng giả hàng không? Tôi đoán mã nguồn MySQL sẽ nói chắc chắn. – derobert