Câu hỏi Truy vấn con vs tham gia


Tôi đã tái cấu trúc một phần chậm của một ứng dụng mà chúng ta thừa hưởng từ một công ty khác để sử dụng một phép nối bên trong thay vì một truy vấn con như

where id in (select id from ... )

Truy vấn được cấu trúc lại chạy nhanh hơn khoảng 100 lần. (~ 50 giây đến ~ 0,3) Tôi mong đợi một sự cải tiến, nhưng bất cứ ai có thể giải thích lý do tại sao nó quá quyết liệt? Các cột được sử dụng trong mệnh đề where đều được lập chỉ mục. Liệu SQL có thực thi truy vấn trong mệnh đề where một lần trên mỗi hàng hay một thứ gì đó không?

Cập nhật - Giải thích kết quả:

Sự khác biệt nằm ở phần thứ hai của truy vấn "id in ()" -

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

so với 1 hàng được lập chỉ mục có tham gia:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index

153
2017-09-26 18:58


gốc


Có thể trùng lặp Tham gia và truy vấn phụ - Ciro Santilli 新疆改造中心 六四事件 法轮功
Không trùng lặp. Câu hỏi này đặc biệt về sự khác biệt về hiệu suất nổi bật. Các câu hỏi khác là tổng quát hơn, mở kết thúc về những ưu và khuyết điểm của mỗi phương pháp tiếp cận và tại sao một cách tiếp cận có vẻ phổ biến hơn. - Basil Bourque


Các câu trả lời:


Một "truy vấn con tương quan" (tức là, một điều kiện trong đó điều kiện phụ thuộc vào các giá trị thu được từ các hàng của truy vấn chứa) sẽ thực hiện một lần cho mỗi hàng. Truy vấn con không tương quan (một trong đó điều kiện nơi độc lập với truy vấn chứa) sẽ thực hiện một lần ở đầu. Công cụ SQL làm cho sự khác biệt này tự động.

Nhưng, vâng, kế hoạch giải thích sẽ cung cấp cho bạn những chi tiết dơ bẩn.


151
2017-09-26 19:03



1 cho việc sử dụng giải thích - susmits
Xin lưu ý rằng DEPENDENT SUBQUERY có nghĩa là chính xác điều tương tự như "truy vấn con tương quan". - Timo


Bạn đang chạy truy vấn con một lần cho mỗi hàng trong khi việc tham gia diễn ra trên các chỉ mục.


36
2017-09-26 19:01



Tôi không nghĩ điều này là đúng. Công cụ SQL chỉ chạy truy vấn phụ một lần và sử dụng kết quả dưới dạng danh sách. - dacracot
Điều đó phụ thuộc - nếu truy vấn phụ được tương quan bằng cách nào đó với truy vấn bên ngoài (sử dụng dữ liệu của nó), nó được thực hiện với mỗi hàng. - qbeuek
Nó có thể đúng trong trường hợp này, nhưng nó không phải là sự thật nói chung. - Amy B
OP EXPLAIN nói DEPENDENT SUBQUERY, đó là chỉ báo rõ ràng nhất về hành vi này. - Timo


Đây là một ví dụ về cách truy vấn con được đánh giá trong MySQL 6.0.

Trình tối ưu hóa mới sẽ chuyển đổi loại truy vấn phụ này thành các kết nối.


16
2017-09-28 07:19



Đó là một bài viết tuyệt vời về trình tối ưu hóa cải thiện MySQL 6.0, cảm ơn - Fire Crow


Chạy kế hoạch giải thích trên mỗi phiên bản, nó sẽ cho bạn biết lý do tại sao.


7
2017-09-26 19:00





trước khi các truy vấn được chạy dựa vào tập dữ liệu, chúng được đặt thông qua trình tối ưu hóa truy vấn, trình tối ưu hóa cố gắng tổ chức truy vấn theo cách như vậy để có thể xóa nhiều bộ (hàng) khỏi tập kết quả nhanh nhất có thể. Thường thì khi bạn sử dụng các truy vấn con (đặc biệt là các truy vấn con), các bộ dữ liệu không thể được cắt tỉa ra khỏi tập kết quả cho đến khi truy vấn bên ngoài bắt đầu chạy.

Với việc nhìn thấy câu truy vấn khó mà nói được điều gì tệ hại về bản gốc, nhưng tôi đoán đó là thứ mà người tối ưu hóa không thể làm tốt hơn nhiều. Chạy 'giải thích' sẽ cho bạn thấy phương pháp tối ưu hóa để truy xuất dữ liệu.


6
2017-09-26 19:06





Thông thường, kết quả của trình tối ưu hóa không thể nhận ra rằng truy vấn phụ có thể được thực thi như một phép nối trong trường hợp nó thực hiện truy vấn phụ cho mỗi bản ghi trong bảng thay vì tham gia bảng trong truy vấn con so với bảng mà bạn đang truy vấn. Một số cơ sở dữ liệu "enterprisey" hơn là tốt hơn lúc này, nhưng họ vẫn còn bỏ lỡ nó đôi khi.


4
2017-09-26 19:03





Câu hỏi này hơi chung chung, vì vậy đây là câu trả lời chung:

Về cơ bản, các truy vấn mất nhiều thời gian hơn khi MySQL có hàng tấn để sắp xếp.

Làm cái này:

Chạy một GIẢI THÍCH trên mỗi truy vấn (câu hỏi được chọn, sau đó là một câu hỏi con) và đăng kết quả ở đây.

Tôi nghĩ rằng việc thấy sự khác biệt trong cách giải thích của MySQL về những truy vấn đó sẽ là một trải nghiệm học tập cho mọi người.


4
2017-09-26 19:05