MySQL: Tham gia nào tốt hơn giữa tham gia ngoài trái và tham gia bên trong


10

Tham gia nào là peforming tốt hơn nếu tất cả chúng cung cấp cùng một kết quả? Ví dụ, tôi có hai bảng employees(emp_id,name, address, designation, age, sex)work_log(emp_id,date,hours_wored). Để có được một số kết quả cụ thể cả hai inner joinleft joincho cùng một kết quả. Nhưng, tôi vẫn còn một số nghi ngờ không chỉ giới hạn trong câu hỏi này.

  • tham gia nào hiệu quả hơn nên ưu tiên trong trường hợp có cùng giá trị kết quả?
  • Các yếu tố khác phải được xem xét tại thời điểm đăng ký tham gia là gì?
  • Có bất kỳ mối quan hệ giữa tham gia nội bộ và tham gia chéo?

Câu trả lời:


14

Không có loại tham gia "tốt hơn" hay "tệ hơn". Chúng có ý nghĩa khác nhau và chúng phải được sử dụng tùy thuộc vào nó.

Trong trường hợp của bạn, bạn có thể không có nhân viên không có work_log (không có hàng trong bảng đó), do đó LEFT JOINJOINsẽ tương đương trong kết quả. Tuy nhiên, nếu bạn có một thứ như vậy (một nhân viên mới không có work_log đã đăng ký), thì sẽ JOINbỏ qua nhân viên đó, trong khi một người tham gia bên trái (có bàn đầu tiên là nhân viên) sẽ hiển thị tất cả trong số họ và null trên các trường từ work_log nếu có không khớp

Giải thích trực quan về các loại THAM GIA

Một lần nữa, hiệu suất là một điều thứ yếu để truy vấn tính chính xác. Một số người nói rằng bạn không nên sử dụng LEFT JOINs. Đúng là LEFT THAM GIA buộc trình tối ưu hóa thực hiện truy vấn theo một thứ tự cụ thể, ngăn chặn một số tối ưu hóa (sắp xếp lại bảng) trong một số trường hợp. Đây là một ví dụ . Nhưng bạn không nên chọn cái khác nếu tính chính xác / ý nghĩa bị hy sinh, vì INNER THAM GIA vốn không tệ hơn. Phần còn lại của tối ưu hóa thông thường áp dụng như bình thường.

Tóm lại, không sử dụng LEFT JOINnếu bạn thực sự có ý nghĩa INNER JOIN.

Trong MySQL CROSS JOIN, INNER JOINJOINgiống nhau. Trong tiêu chuẩn và về mặt ngữ nghĩa, a CROSS JOININNER JOINmột ONmệnh đề không có mệnh đề, do đó bạn có được mọi kết hợp các hàng giữa các bảng.

Bạn có ví dụ về tất cả các loại tham gia ngữ nghĩa trên Wikipedia . Trong thực tế, trong MySQL, chúng ta có xu hướng chỉ viết JOINLEFT JOIN.


1
Gr8 giải thích @jynus. Thật may mắn khi tôi chỉ nhận được câu trả lời cho câu hỏi của tôi từ bạn.
ursitesion

1 đồ họa có liên quan là tốt hơn 1000 từ. Bạn đã làm nó?
Fr0zenFyr

Không, tôi không, ghi công là ở dưới cùng của hình ảnh codeproject.com/Articles/33052/... - Mặc dù sử dụng sơ đồ Venn để đại diện cho tham gia là như cũ như chính thức hóa đại số của nó: en.wikipedia.org/wiki/Relational_algebra
jynus

Tôi bắt đầu với một tập hợp các bình luận và sau đó nhận ra tất cả sôi sục - nó phụ thuộc vào truy vấn của bạn. +1 từ tôi!
iheanyi


0

Tham gia nào hoạt động tốt hơn nếu tất cả chúng cung cấp cùng một kết quả?

Tôi bổ sung câu trả lời trước đó, cho những gì tôi biết, MySQL được tối ưu hóa để có cùng hiệu suất.

Với các chỉ mục tốt, ví dụ, mệnh đề JOINvs LEFT JOIN+ WHEREđể lọc, sẽ là điều tương tự. Tối ưu hóa so với Đọc của con người có ý nghĩa đối với các truy vấn lớn với nhiều liên kết.

Sử dụng các chỉ mục tốt và bộ nhớ cache là quan trọng hơn.

Bạn có thể đọc một lời giải thích tốt về quá trình tối ưu hóa ở đây:

Quá trình tối ưu hóa truy vấn : Một truy vấn thường có thể được thực hiện theo nhiều cách khác nhau và tạo ra cùng một kết quả. Công việc của trình tối ưu hóa là tìm ra lựa chọn tốt nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.