sql - 在 SQLite 中分页结果的最佳方式

标签 sql database sqlite database-view

假设我在 SQLite 中有以下查询:

SELECT * FROM mytable ORDER BY product ASC

我希望最终用户能够以可滚动的方式查看数据(例如,像 Excel 中当前可查看的数据)。如果用户向下滚动 100 个结果,而不是做类似的事情:

SELECT * FROM mytable ORDER BY product ASC LIMIT 50 OFFSET 100

我想确保返回给他们的结果在 25 毫秒左右,而不是让他们在每次移出可视范围时等待执行查询所需的时间。

执行此操作的最佳方法是什么?在伪代码中,我的思路如下:

-- 1st time query is run
SELECT * FROM mytable ORDER BY product ASC LIMIT 50 -- in main thread
INSERT INTO queryset_cache -- in background thread
  SELECT rowid, * FROM mytable ORDER BY product ASC 

-- 2nd time query is run, offset 84,500 (user scrolls down to that position
SELECT * FROM queryset_cache ORDER BY rowid LIMIT 50 OFFSET 84500

这是完成我想要做的事情的最佳方式吗?或者是否有一种标准化的方法可以在 SQLite 中执行上述操作?如果是这样,最好的方法是什么?

最佳答案

使用 OFFSET 通常不是一个好主意,因为数据库在返回结果之前必须跳过这么多行。

一个好的解决方案是为 product 列和 SELECT ... FROM ... WHERE product BETWEEN _start_ AND _end_

建立索引

并不断更改 start 和 _end 以便数据库返回所需的页面。

如果这很困难,比方说,您有很多行具有相同的产品,您可以定义一个复合键 (product, xxx) 以更好地选择行并使用它来选择页面。

如果所有其他方法都失败了,并且您决定创建一个用于分页的新表——添加一个自动增量 id 列并使用该键进行分页。

关于sql - 在 SQLite 中分页结果的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58069453/

相关文章:

sql - 在 Postgresql 9.2 中安装扩展时出错

php - 使用 ORDER BY 加入两个 sql 查询

linux - 我需要在 oracle 数据库卡住时测试我的应用程序的行为。因此我需要模拟 oracle DB freeze

.net - CorFlags.exe、System.Data.SQLite.dll 和 BadImageFormatException

sql - Oracle SQL Developer 查询以其他用户身份连接

sql - 如何检查 XML 在 SQL 中是否有值(value)?

java - hibernate :saveorupdate() 不更新对象

javascript - 插入查询的语法不正确

c# - 锁定 SQLite 数据库以从 C# 读取

sqlite - SQLite 中的儒略日到 ISO 8601 字符串