我通常使用组合索引对希望分页或“流式”请求的数据进行排序。
假设一个客户可以下多个订单.. 并且客户 0 到 11 存在,并且每个客户有多个订单都以随机顺序插入。我想根据客户编号和日期对查询进行排序。您也应该将 id 字段排序到最后一个客户有多个相同日期的拆分集(即使这可能永远不会发生)。
sqlite> CREATE INDEX customer_asc_date_asc_index_asc ON orders
(customer ASC, date ASC, id ASC);
获取排序查询的第 1 页(限制为 10 项):
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
获取下一页:
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
等等……
当您使用查询 OFFSET 和 LIMIT 时,将索引放在适当的位置会减少服务器端索引扫描。查询时间越长,偏移量越高,驱动器越难寻找。使用这种方法可以消除这种情况。
如果您计划稍后加入数据但每个请求只需要一组有限的数据,建议您使用此方法。如上所述加入 SUBSELECT 以减少大型表的内存开销。