Giới hạn của 1000 1000


11

Gần đây tôi đã phát hiện ra rằng MySQL có một offsettính năng. Tôi đã cố gắng tìm tài liệu về kết quả của bù, hoặc sự khác biệt giữa bù và biến thể giới hạn, nhưng dường như tôi không thể tìm thấy những gì tôi đang tìm kiếm.

Hãy nói rằng tôi có 10.000 hàng trong một bảng và tôi muốn 25 kết quả, từ hàng 1.000. Theo như tôi đã đạt được, tôi có thể làm cả hai để có được kết quả như nhau:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

Những gì tôi muốn biết là sự khác biệt giữa hai.

  • Điều này thực sự làm tương tự hay sự hiểu biết của tôi sai?
  • Là một chậm / nhanh hơn trong các bảng lớn hơn
  • Kết quả của phần bù có thay đổi khi tôi thực hiện không WHERE column=1(giả sử cột có> 100 giá trị khác nhau)
  • Kết quả của phần bù có thay đổi khi tôi thực hiện không ORDER BY column ASC(vì nó có giá trị ngẫu nhiên)

Nếu đây là một câu hỏi 'ngu ngốc' và ai đó biết bất kỳ tài liệu nào khai sáng chủ đề, vui lòng thêm chúng vào phần trả lời.
Tôi có cảm giác bù đắp bỏ qua các hàng X đầu tiên được tìm thấy trong cơ sở dữ liệu, không quan tâm đến việc sắp xếp và vị trí.


Tài liệu MySQL giải thích điều này một cách hoàn hảo. Có một lý do mà bạn không thích nhìn vào nó?
siride

1
"Để tương thích với PostgreSQL, MySQL cũng hỗ trợ cú pháp bù LIMIT row_count OFFSET." (từ dev.mysql.com/doc/refman/5.5/en/select.html ).
siride

Bởi vì điều này vẫn không trả lời câu hỏi của tôi. Từ trích dẫn của bạn (và văn bản của họ trên trang) tôi nên kết luận rằng phần bù giống với giới hạn, chỉ được viết khác nhau, như thể GIỚI HẠN là công cụ chọn tốc ký?
Martijn

1
đó là cú pháp khác nhau để diễn đạt cùng một điều. Các câu hỏi phụ khác của bạn hoàn toàn khác với tiêu đề và phần đầu tiên của bài viết của bạn.
siride

1
Tôi hiểu rằng nếu đó là điều tương tự, các truy vấn khác sẽ không bị ảnh hưởng khác nhau trong cả hai trường hợp. Tôi chỉ không tin đó là điều tương tự, đó là câu trả lời tôi đang tìm kiếm, cảm ơn.
Martijn

Câu trả lời:


9

Về mặt hoạt động

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

hoàn toàn không có sự khác biệt trong các tuyên bố

Nhận xét của @ siride là chính xác điểm.

LIMIT 1000,25 có nghĩa LIMIT 25 OFFSET 1000

Từ cùng một tài liệu

LIMIT row_count tương đương với LIMIT 0, row_count

CÂU HỎI THỰC TẾ CỦA BẠN

  • Điều này thực sự làm tương tự hay sự hiểu biết của tôi sai?
  • Là một chậm / nhanh hơn trong các bảng lớn hơn

Vì cả hai truy vấn đều giống nhau, không có sự khác biệt

  • Kết quả của phần bù có thay đổi khi tôi thực hiện cột WHERE = 1 không (cột nói có> 100 giá trị khác nhau)
  • Kết quả của phần bù có thay đổi khi tôi thực hiện ĐẶT HÀNG theo cột ASC không (vì nó có giá trị ngẫu nhiên)

Sử dụng LIMITkhông thay đổi bất kỳ bộ kết quả. Họ chỉ cần điều hướng trong tập kết quả.

Truy vấn này

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

sẽ khác với

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

bởi vì GIỚI HẠN đang được áp dụng ở một giai đoạn khác.

Truy vấn đầu tiên không trả về gì nếu tablename có ít hơn 1000 hàng

Truy vấn thứ hai không trả về gì nếu truy vấn con có ít hơn 1000 hàng

PHẦN KẾT LUẬN

Bạn sẽ phải điêu khắc truy vấn để đảm bảo rằng bạn đang sắp xếp dữ liệu ở đúng giai đoạn


1
Cảm ơn bạn. Điều này: "Hoàn toàn không có sự khác biệt trong các tuyên bố" chính xác là những gì tôi đang tìm kiếm, và với chút thông tin đó tôi có thể thấy sự sắp xếp đó hoặc nơi không quan trọng. Không chắc chắn về thời tiết đó là điều tương tự, và trong việc mã hóa ma quỷ có trong chi tiết, tôi muốn biết chắc chắn :)
Martijn
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.