Các chi tiết phụ thuộc vào việc triển khai nhưng nói chung nói, kết quả được lưu vào bộ đệm. Việc thực thi một truy vấn đối với cơ sở dữ liệu sẽ trả về một số tập hợp kết quả. Nếu nó đủ nhỏ, tất cả các kết quả có thể được trả về với lệnh gọi ban đầu hoặc một số có thể có và nhiều kết quả hơn được trả lại khi bạn lặp lại đối tượng kết quả.
Hãy nghĩ về trình tự theo cách này:
- Bạn mở một kết nối với cơ sở dữ liệu;
- Có thể có cuộc gọi thứ hai để chọn cơ sở dữ liệu hoặc nó có thể được thực hiện như một phần của (1);
- Bước xác thực và kết nối đó là (ít nhất) một chuyến khứ hồi tới máy chủ (bỏ qua các kết nối liên tục);
- Bạn thực hiện một truy vấn trên máy khách;
- Truy vấn đó được gửi đến máy chủ;
- Máy chủ phải xác định cách thực thi truy vấn;
- Nếu trước đó máy chủ đã thực thi truy vấn thì kế hoạch thực thi có thể vẫn còn trong bộ đệm truy vấn. Nếu không, một kế hoạch mới phải được tạo;
- Máy chủ thực hiện truy vấn như đã cho và trả về kết quả cho máy khách;
- Kết quả đó sẽ chứa một số vùng đệm của các hàng phụ thuộc vào việc triển khai. Nó có thể là 100 hàng hoặc nhiều hơn hoặc ít hơn. Tất cả các cột được trả về cho mỗi hàng;
- Khi bạn tìm nạp thêm hàng, cuối cùng máy khách sẽ yêu cầu máy chủ cung cấp thêm hàng. Điều này có thể là khi khách hàng hết hoặc nó có thể được thực hiện trước. Một lần nữa, điều này phụ thuộc vào việc triển khai.
Ý tưởng của tất cả điều này là giảm thiểu các vòng quay tới máy chủ mà không gửi lại quá nhiều dữ liệu không cần thiết, đó là lý do tại sao nếu bạn yêu cầu một triệu hàng, bạn sẽ không lấy lại được tất cả cùng một lúc.
Các mệnh đề LIMIT - hoặc bất kỳ mệnh đề nào trên thực tế - sẽ sửa đổi tập kết quả.
Cuối cùng, (7) quan trọng vì SELECT * FROM table WHERE a = 'foo'
và SELECT * FROM table WHERE a = 'bar'
là hai truy vấn khác nhau đối với trình tối ưu hóa cơ sở dữ liệu, do đó, một kế hoạch thực thi phải được xác định cho từng truy vấn riêng biệt. Nhưng một truy vấn được tham số hóa (SELECT * FROM table WHERE a = :param
) với các tham số khác nhau là một truy vấn và chỉ cần được lập kế hoạch một lần (ít nhất là cho đến khi nó thoát ra khỏi bộ nhớ cache truy vấn).