Sqlite 查询优化(使用 Limit 和 Offset)

标签 sqlite

以下是我用于从具有数百万条记录的数据库中获取固定数量的记录的查询:-

select * from myTable LIMIT 100 OFFSET 0

我观察到的是,如果偏移量非常高,比如 90000,那么执行查询需要更多时间。以下是具有不同偏移量的 2 个查询之间的时间差:

select * from myTable LIMIT 100 OFFSET 0       //Execution Time is less than 1sec
select * from myTable LIMIT 100 OFFSET 95000   //Execution Time is almost 15secs

谁能建议我如何优化这个查询?我的意思是,对于我希望从任何 OFFSET 检索的任何数量的记录,查询执行时间应该相同且快速。

新增:- 实际情况是我有一个数据库有超过 100 万条记录。但由于它是嵌入式设备,我不能执行“select * from myTable”然后从查询中获取所有记录。我的设备崩溃了。相反,我所做的是按照上述查询逐批获取记录(批量大小 = 100 或 1000 条记录)。但正如我所提到的,它随着偏移量的增加而变慢。所以,我的最终目标是我想从数据库中读取所有记录。但由于我无法在一次执行中获取所有记录,我需要一些其他有效的方法来实现这一点。

最佳答案

正如JvdBerg所说,LIMIT/OFFSET 中没有使用索引。 简单地添加“ORDER BY indexed_field”也无济于事。

要加快分页速度,您应该避免使用 LIMIT/OFFSET 并改用 WHERE 子句。例如,如果您的主键字段名为“id”并且没有间隙,那么您上面的代码可以这样重写:

SELECT * FROM myTable WHERE id>=0     AND id<100     //very fast!
SELECT * FROM myTable WHERE id>=95000 AND id<95100   //as fast as previous line!

关于Sqlite 查询优化(使用 Limit 和 Offset),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12266025/

相关文章:

android - 在Ormlite Android中更新数据库的安全方法

python - 如何在 FreeBSD 上的 python 中使用 sqlite3?

ios - 如何在sqlite数据库的表行中添加NSDictionary

php - SQLite 在 PHP 的 LIKE 查询中使用变量

sql - Scala 元组问题

java - SQLite onUpgrade 删除和添加列

html - sqlite-fts3 : custom tokenizer?

sqlite - 我需要转换 hh :mm:ss to seconds

mysql - 在输出中获得特定结果

php - 无法从 Laravel 中的 SQLite 表中删除