如何优化SQLite ORDER BY rowid?

如何优化SQLite ORDER BY rowid?,第1张

概述我想查询我的sqlite数据库中所有大于20的“级别”值,将结果限制为100并按rowid排序. 按rowid排序时,查询速度要慢得多.该数据库包含约300万条记录 并且level的最大值为50.为level创建索引. 这个陈述需要大约20ms: SELECT * FROM log WHERE level > 20 LIMIT 100 这个陈述需要大约100毫秒: SELECT * FROM lo 我想查询我的sqlite数据库中所有大于20的“级别”值,将结果限制为100并按rowID排序.

按rowID排序时,查询速度要慢得多.该数据库包含约300万条记录
并且level的最大值为50.为level创建索引.

这个陈述需要大约20ms:

SELECT * FROM log WHERE level > 20 liMIT 100

这个陈述需要大约100毫秒:

SELECT * FROM log WHERE level > 20 ORDER BY rowID liMIT 100

此语句需要约1000毫秒(不存在级别值大于50的行):

SELECT * FROM log WHERE level > 50 ORDER BY rowID liMIT 100

有没有办法优化这个以获得更快的ORDER BY查询?

这是使用的索引:

CREATE INDEX level_IDx ON table (level)
有两种可能的方法来执行此查询:

>在level_IDx索引中搜索级别>> 20的第一个条目,然后扫描以下所有条目并从表中获取每个相应的行.
由于索引条目未以rowID顺序存储,因此必须对所有结果进行排序.
然后可以返回前100个.
>忽略索引.
扫描表格的所有行(已经以rowID顺序存储),并返回级别列匹配的任何行.

数据库估计第二种方法更快.

如果您估计第一种方法更快,即,如此少的行与级别过滤器匹配,那么获取和排序剩余行比在扫描表中时忽略不匹配的行更快,那么您可以强制使用数据库带有INDEXED BY子句的索引:

SELECT *FROM log INDEXED BY level_IDxWHERE level > 20ORDER BY rowIDliMIT 100

但是,如果您自己的估计是错误的,强制索引会导致可怕的减速.

总结

以上是内存溢出为你收集整理的如何优化SQLite ORDER BY rowid?全部内容,希望文章能够帮你解决如何优化SQLite ORDER BY rowid?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存