如何优化SQLite ORDER BY rowid?
发布时间:2020-12-12 23:40:58 所属栏目:百科 来源:网络整理
导读:我想查询我的sqlite数据库中所有大于20的“级别”值,将结果限制为100并按rowid排序. 按rowid排序时,查询速度要慢得多.该数据库包含约300万条记录 并且level的最大值为50.为level创建索引. 这个陈述需要大约20ms: SELECT * FROM log WHERE level 20 LIMIT 10
我想查询我的sqlite数据库中所有大于20的“级别”值,将结果限制为100并按rowid排序.
按rowid排序时,查询速度要慢得多.该数据库包含约300万条记录 这个陈述需要大约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的第一个条目,然后扫描以下所有条目并从表中获取每个相应的行. 数据库估计第二种方法更快. 如果您估计第一种方法更快,即,如此少的行与级别过滤器匹配,那么获取和排序剩余行比在扫描表中时忽略不匹配的行更快,那么您可以强制使用数据库带有INDEXED BY子句的索引: SELECT * FROM log INDEXED BY level_idx WHERE level > 20 ORDER BY rowid LIMIT 100 但是,如果您自己的估计是错误的,强制索引会导致可怕的减速. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |