Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tránh các truy vấn lồng nhau

Nó thực sự phụ thuộc, tôi đã gặp những tình huống mà tôi đã cải thiện một số truy vấn bằng cách sử dụng truy vấn con.

Các yếu tố mà tôi biết là:

  • nếu truy vấn con có sử dụng các trường từ truy vấn bên ngoài để so sánh hay không ( tương quan hoặc không)
  • nếu mối quan hệ giữa truy vấn bên ngoài và truy vấn phụ được bao phủ bởi các chỉ mục
  • nếu không có chỉ mục nào có thể sử dụng trên các phép nối và truy vấn con không tương quan và trả về một kết quả nhỏ thì có thể sử dụng nó nhanh hơn
  • tôi cũng đã gặp phải các tình huống khi chuyển đổi một truy vấn sử dụng thứ tự theo thứ tự thành một truy vấn không sử dụng nó và hơn là biến nó thành một truy vấn con đơn giản và sắp xếp để cải thiện hiệu suất trong mysql

Dù sao, việc kiểm tra các biến thể khác nhau (vui lòng sử dụng SQL_NO_CACHE) luôn là điều tốt, và chuyển các truy vấn tương quan thành các phép nối là một cách thực hành tốt.

Tôi thậm chí còn đi xa hơn để gọi nó là một thực hành rất hữu ích.

Có thể là nếu truy vấn tương quan là điều đầu tiên bạn nghĩ đến rằng bạn không chủ yếu nghĩ về các hoạt động tập hợp, mà chủ yếu về các hoạt động thủ tục và khi xử lý cơ sở dữ liệu quan hệ, rất hữu ích nếu áp dụng đầy đủ tập hợp quan điểm về mô hình dữ liệu và các chuyển đổi trên đó.

CHỈNH SỬA: Thủ tục so với Quan hệ
Suy nghĩ về các phép toán tập hợp so với các phép toán thủ tục rút gọn đến mức tương đương trong một số biểu thức đại số tập hợp, ví dụ phép chọn trên một liên hợp tương đương với phép chọn liên hợp. Không có sự khác biệt giữa hai thủ tục.
Nhưng khi bạn so sánh hai thủ tục, chẳng hạn như áp dụng tiêu chí lựa chọn cho mọi phần tử của liên hợp với tạo liên hợp và sau đó áp dụng lựa chọn, thì cả hai là các thủ tục hoàn toàn khác nhau, có thể có các thuộc tính rất khác nhau (ví dụ:sử dụng CPU, I / O, bộ nhớ).

Ý tưởng đằng sau cơ sở dữ liệu quan hệ là bạn không cố gắng mô tả cách nhận kết quả (thủ tục), mà chỉ những gì bạn muốn và rằng hệ thống quản lý cơ sở dữ liệu sẽ quyết định con đường (thủ tục) tốt nhất để thực hiện yêu cầu của bạn. Đây là lý do tại sao SQL được gọi là ngôn ngữ thế hệ thứ 4 (4GL) .

Một trong những thủ thuật giúp bạn làm điều đó là nhắc nhở bản thân rằng các bộ giá trị không có thứ tự vốn có (các phần tử tập hợp không có thứ tự). mô hình của bạn đại diện tốt cho không gian vấn đề, hay nói cách khác nếu ý nghĩa gắn với tên bảng và các mối quan hệ của bạn được thực hiện đúng hoặc nói cách khác nếu cơ sở dữ liệu của bạn được thiết kế tốt).

Do đó, bạn không phải nghĩ làm thế nào, chỉ làm gì.

Trong trường hợp của bạn, đó chỉ là ưu tiên hơn các truy vấn tương quan, vì vậy có thể tôi không cho bạn biết bất kỳ điều gì mới, nhưng bạn đã nhấn mạnh điểm đó, do đó nhận xét.

Tôi nghĩ rằng nếu bạn hoàn toàn thoải mái với tất cả các quy tắc chuyển đổi truy vấn từ dạng này sang dạng khác ( quy tắc chẳng hạn như tính phân phối) mà bạn không muốn các truy vấn con tương quan (mà bạn sẽ thấy tất cả các biểu mẫu đều như nhau).

(Lưu ý:ở trên thảo luận về nền tảng lý thuyết, quan trọng đối với thiết kế cơ sở dữ liệu; thực tế các khái niệm trên đều sai lệch - không phải tất cả các bản viết lại tương đương của một truy vấn nhất thiết phải được thực thi nhanh chóng, các khóa chính được phân cụm làm cho các bảng có thứ tự kế thừa trên đĩa, v.v. nhưng những sai lệch chỉ là sai lệch; thực tế là không phải tất cả các truy vấn tương đương đều thực thi nhanh là sự không hoàn hảo của DBMS thực tế chứ không phải các khái niệm đằng sau nó)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AVG () - Tính giá trị trung bình của một cột trong MySQL

  2. MySQL chọn các hàng không có ngày giữa ngày

  3. Làm thế nào để tránh sửa chữa với Keycache?

  4. Django + MySQL trên Mac OS 10.6.2 Snow Leopard

  5. Laravel 5.3:Lỗi cú pháp hoặc vi phạm quyền truy cập:1463 Trường không nhóm 'khoảng cách' được sử dụng trong mệnh đề HAVING