Tôi thường sử dụng các chỉ số để sắp xếp dữ liệu thông qua kết hợp tôi muốn đánh số trang hoặc yêu cầu "streamily".
Giả sử khách hàng có thể thực hiện nhiều đơn đặt hàng .. và khách hàng từ 0 đến 11 tồn tại và có một số đơn đặt hàng cho mỗi khách hàng được chèn theo thứ tự ngẫu nhiên. Tôi muốn sắp xếp truy vấn dựa trên số khách hàng theo sau ngày tháng. Bạn nên sắp xếp trường id cũng là cuối cùng để phân chia bộ nơi khách hàng có một số ngày giống nhau (ngay cả khi điều đó có thể không bao giờ xảy ra).
sqlite> CREATE INDEX customer_asc_date_asc_index_asc ON orders
(customer ASC, date ASC, id ASC);
Nhận trang 1 của một truy vấn được sắp xếp (giới hạn 10 bài):
sqlite> SELECT id, customer, date FROM orders
ORDER BY customer ASC, date ASC, id ASC LIMIT 10;
2653|1|1303828585
2520|1|1303828713
2583|1|1303829785
1828|1|1303830446
1756|1|1303830540
1761|1|1303831506
2442|1|1303831705
2523|1|1303833761
2160|1|1303835195
2645|1|1303837524
Lấy trang tiếp theo:
sqlite> SELECT id, customer, date FROM orders WHERE
(customer = 1 AND date = 1303837524 and id > 2645) OR
(customer = 1 AND date > 1303837524) OR
(customer > 1)
ORDER BY customer ASC, date ASC, id ASC LIMIT 10;
2515|1|1303837914
2370|1|1303839573
1898|1|1303840317
1546|1|1303842312
1889|1|1303843243
2439|1|1303843699
2167|1|1303849376
1544|1|1303850494
2247|1|1303850869
2108|1|1303853285
Và vân vân ...
Có các chỉ mục tại chỗ làm giảm quét chỉ mục phía máy chủ khi bạn sử dụng truy vấn OFFSET cùng với LIMIT. Thời gian truy vấn được lâu hơn và các ổ đĩa tìm kiếm khó khăn càng cao bù đắp đi. Sử dụng phương pháp này loại bỏ điều đó.
Sử dụng phương pháp này được thông báo nếu bạn dự định tham gia dữ liệu sau nhưng chỉ cần một tập hợp dữ liệu hạn chế theo yêu cầu. Tham gia vào SUBSELECT như mô tả ở trên để giảm chi phí bộ nhớ cho các bảng lớn.
SQLite sẽ KHÔNG sử dụng cột thứ hai của chỉ mục nếu cột đầu tiên là biểu thức bất bình đẳng (ví dụ: khách hàng> 33). (hầu hết các công cụ cơ sở dữ liệu sẽ, khó khăn). – vmatyi
Nếu bạn tạo hai chỉ mục riêng biệt, chỉ một trong số chúng sẽ được sử dụng, biểu thức khác sẽ được đánh giá trên tập kết quả được tạo bởi lần đầu tiên. (trên một Oracle, nó _could_ thực hiện tìm kiếm hai chỉ mục và giao cắt các tập kết quả, nếu tối ưu hóa dựa trên chi phí và các tiêu chí nhất định đáp ứng, nhưng đó là một trường hợp hiếm hoi). – vmatyi