Làm cách nào để chọn 5 hàng đầu tiên trong mysql?

Truy vấn Top-N là các truy vấn giới hạn kết quả ở một số hàng cụ thể. Đây thường là các truy vấn cho các mục nhập gần đây nhất hoặc "tốt nhất" của một tập hợp kết quả. Để thực hiện hiệu quả, việc xếp hạng phải được thực hiện với một

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
7 có đường dẫn

Cách đơn giản nhất để chỉ tìm nạp các hàng đầu tiên của truy vấn là tìm nạp các hàng được yêu cầu rồi đóng câu lệnh. Thật không may, trình tối ưu hóa không thể thấy trước điều đó khi chuẩn bị kế hoạch thực hiện. Để chọn kế hoạch thực hiện tốt nhất, trình tối ưu hóa phải biết liệu cuối cùng ứng dụng có tìm nạp tất cả các hàng hay không. Trong trường hợp đó, quét toàn bộ bảng với thao tác sắp xếp rõ ràng có thể hoạt động tốt nhất, mặc dù một

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
7 theo đường dẫn có thể tốt hơn khi chỉ tìm nạp mười hàng—ngay cả khi cơ sở dữ liệu phải tìm nạp từng hàng riêng lẻ. Điều đó có nghĩa là trình tối ưu hóa phải biết liệu bạn có hủy bỏ câu lệnh hay không trước khi tìm nạp tất cả các hàng để nó có thể chọn kế hoạch thực thi tốt nhất

Mẹo

Thông báo cho cơ sở dữ liệu bất cứ khi nào bạn không cần tất cả các hàng

Tiêu chuẩn SQL đã loại trừ yêu cầu này trong một thời gian dài. Phần mở rộng tương ứng (

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
1) cuối cùng đã được giới thiệu với SQL. 2008 và hiện có sẵn trong IBM DB2, PostgreSQL, SQL Server 2012 và Oracle 12c. Một mặt, điều này là do tính năng này là một tiện ích mở rộng không cốt lõi và mặt khác là do mỗi cơ sở dữ liệu đã cung cấp giải pháp độc quyền của riêng mình trong nhiều năm

Các ví dụ sau đây cho thấy việc sử dụng các tiện ích mở rộng nổi tiếng này bằng cách truy vấn mười lần bán hàng gần đây nhất. Cơ sở luôn giống nhau. tìm nạp tất cả doanh số, bắt đầu với doanh số gần đây nhất. Cú pháp top-N tương ứng chỉ hủy bỏ việc thực thi sau khi tìm nạp mười hàng

DB2

DB2 hỗ trợ cú pháp

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
1 của tiêu chuẩn ít nhất kể từ phiên bản 9 (LUW và zOS)

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY

Từ khóa độc quyền

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
3 được hỗ trợ kể từ DB2 LUW 9. 7 (yêu cầu
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
4)

mysql

MySQL và PostgreSQL sử dụng mệnh đề

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
3 để hạn chế số hàng được tìm nạp

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
Nhà tiên tri

Cơ sở dữ liệu Oracle đã giới thiệu tiện ích mở rộng

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
1 với bản phát hành 12c. Với các bản phát hành trước đó, bạn phải sử dụng cột giả
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
7 tự động đánh số các hàng trong tập hợp kết quả. Để sử dụng cột này trong bộ lọc, chúng tôi phải ngắt truy vấn

SELECT *
  FROM (
       SELECT *
         FROM sales
        ORDER BY sale_date DESC
       )
 WHERE rownum <= 10
PostgreSQL

PostgreSQL hỗ trợ tiện ích mở rộng

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
1 kể từ phiên bản 8. 4. Mệnh đề
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
3 được sử dụng trước đó vẫn hoạt động như trong ví dụ về MySQL

Máy chủ
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
SQL

SQL Server cung cấp mệnh đề

SELECT *
  FROM (
       SELECT *
         FROM sales
        ORDER BY sale_date DESC
       )
 WHERE rownum <= 10
0 để hạn chế số hàng được tìm nạp

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
4

Bắt đầu với bản phát hành 2012, SQL Server cũng hỗ trợ tiện ích mở rộng

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 LIMIT 10
1

Tất cả các truy vấn SQL được hiển thị ở trên đều đặc biệt vì cơ sở dữ liệu nhận dạng chúng là các truy vấn N hàng đầu

Quan trọng

Cơ sở dữ liệu chỉ có thể tối ưu hóa một truy vấn cho một phần kết quả nếu nó biết điều này ngay từ đầu

Nếu trình tối ưu hóa nhận thức được thực tế là chúng ta chỉ cần mười hàng, thì nó sẽ ưu tiên sử dụng

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
7 theo đường ống nếu có

DB2____16

Hành vi top-N không hiển thị trực tiếp trong kế hoạch thực hiện DB2 trừ khi có một hoạt động

SELECT *
  FROM (
       SELECT *
         FROM sales
        ORDER BY sale_date DESC
       )
 WHERE rownum <= 10
3 được yêu cầu (khi đó, chế độ xem
SELECT *
  FROM (
       SELECT *
         FROM sales
        ORDER BY sale_date DESC
       )
 WHERE rownum <= 10
4 chỉ ra nó trong ngoặc đơn.
SELECT *
  FROM (
       SELECT *
         FROM sales
        ORDER BY sale_date DESC
       )
 WHERE rownum <= 10
5, xem ví dụ tiếp theo)

Trong ví dụ cụ thể này, người ta có thể nghi ngờ rằng đây phải là truy vấn top-N vì ước tính số hàng giảm đột ngột mà không thể giải thích được bằng bất kỳ vị từ lọc nào (phần Thông tin vị từ trống)

Oracle
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
0

Kế hoạch thực hiện của Oracle chỉ ra việc chấm dứt theo kế hoạch với hoạt động

SELECT *
  FROM (
       SELECT *
         FROM sales
        ORDER BY sale_date DESC
       )
 WHERE rownum <= 10
6. Điều đó có nghĩa là cơ sở dữ liệu đã nhận ra cú pháp top-N

Mẹo

Phụ lục A, “Kế hoạch thực hiện”, tóm tắt các hoạt động tương ứng cho DB2, MySQL, Oracle, PostgreSQL và SQL Server

Quan trọng

Truy vấn top-N theo đường ống không cần đọc và sắp xếp toàn bộ tập kết quả

Nếu không có chỉ mục phù hợp trên

SELECT *
  FROM (
       SELECT *
         FROM sales
        ORDER BY sale_date DESC
       )
 WHERE rownum <= 10
7 cho một
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
7 theo đường ống, cơ sở dữ liệu phải đọc và sắp xếp toàn bộ bảng. Hàng đầu tiên chỉ được gửi sau khi đọc hàng cuối cùng từ bảng

DB2

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
3Oracle
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
4

Kế hoạch thực thi này không có đường dẫn

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
7 và gần như chậm bằng việc hủy bỏ việc thực thi từ phía máy khách. Sử dụng cú pháp top-N vẫn tốt hơn vì cơ sở dữ liệu không cần cụ thể hóa kết quả đầy đủ mà chỉ cần 10 hàng gần đây nhất. Điều này đòi hỏi bộ nhớ ít hơn đáng kể. Kế hoạch thực hiện của Oracle chỉ ra sự tối ưu hóa này với công cụ sửa đổi
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
0 trên hoạt động của
SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
1

Thay mặt tôi

Tôi kiếm sống từ việc đào tạo SQL, điều chỉnh và tư vấn SQL và cuốn sách của tôi “Giải thích về hiệu suất SQL”. Tìm hiểu thêm tại https. // winand. tại/

Ưu điểm của truy vấn top-N theo đường ống không chỉ bao gồm tăng hiệu suất ngay lập tức mà còn cải thiện khả năng mở rộng. Không sử dụng thực thi theo đường ống, thời gian phản hồi của truy vấn top-N này tăng theo kích thước bảng. Tuy nhiên, thời gian phản hồi khi sử dụng thực thi theo đường ống dẫn chỉ tăng theo số lượng hàng được chọn. Nói cách khác, thời gian phản hồi của truy vấn top-N theo đường ống luôn giống nhau; . Chỉ khi độ sâu của cây B tăng lên thì truy vấn mới chậm hơn một chút

Hình 7. 1 cho thấy khả năng mở rộng cho cả hai biến thể trên khối lượng dữ liệu ngày càng tăng. Có thể thấy rõ mức tăng thời gian phản hồi tuyến tính cho một lần thực thi mà không có đường ống dẫn

SELECT *
  FROM sales
 ORDER BY sale_date DESC
 FETCH FIRST 10 ROWS ONLY
7. Thời gian phản hồi cho việc thực thi theo đường ống không đổi

Hình 7. 1 Khả năng mở rộng của các truy vấn Top-N

Làm cách nào để chọn 5 hàng đầu tiên trong mysql?

Mặc dù thời gian phản hồi của truy vấn top-N theo đường ống không phụ thuộc vào kích thước bảng nhưng nó vẫn tăng theo số lượng hàng được chọn. Do đó, thời gian phản hồi sẽ tăng gấp đôi khi chọn gấp đôi số hàng. Điều này đặc biệt quan trọng đối với các truy vấn “phân trang” tải các kết quả bổ sung vì các truy vấn này thường bắt đầu lại ở mục nhập đầu tiên; . Tuy nhiên, có một giải pháp cho vấn đề này cũng như chúng ta sẽ thấy trong phần tiếp theo

Làm cách nào để chọn 5 hàng đầu tiên trong MySQL?

Để chọn 10 phần tử đầu tiên từ cơ sở dữ liệu bằng mệnh đề SQL ORDER BY với LIMIT 10. Chèn một số bản ghi vào bảng bằng lệnh chèn. Hiển thị tất cả các bản ghi từ bảng bằng cách sử dụng câu lệnh chọn

Làm cách nào để chọn 5 hàng trên cùng trong MySQL?

Đây là cú pháp để chọn N hàng trên cùng trong MySQL. Trong câu lệnh trên, chúng ta liệt kê các cột column1, column2,… mà bạn muốn chọn trong truy vấn của mình. Ngoài ra, bạn cần chỉ định GIỚI HẠN n sau tên bảng, trong đó n là số hàng bạn muốn chọn . Truy vấn trên sẽ chọn n bản ghi hàng đầu trong bảng của bạn.

Bạn sẽ chọn 10 hàng đầu tiên trong cơ sở dữ liệu như thế nào?

Câu trả lời ANSI SQL là TÌM HIỂU ĐẦU TIÊN . Nếu bạn muốn bao gồm các dây buộc, thay vào đó hãy thực hiện FETCH 10 ROWS WITH TIES. Để bỏ qua một số hàng đã chỉ định, hãy sử dụng OFFSET , e. g. Sẽ bỏ qua 20 hàng đầu tiên, sau đó tìm nạp 10 hàng.

Làm cách nào để chọn 10 hàng trong MySQL?

CHỌN * TỪ ( CHỌN * TỪ Tên bảng của bạn ĐẶT HÀNG THEO id DESC GIỚI HẠN 10 ) Var1 ĐẶT HÀNG THEO id ASC; . mysql> CHỌN * TỪ ( -> CHỌN * TỪ Last10RecordsDemo ĐẶT HÀNG BẰNG id MÔ TẢ GIỚI HẠN 10 ->) Var1 -> -> ĐẶT HÀNG THEO id ASC;