Civ*_*ing 6 sql sqlite sorting
我想查询我的sqlite数据库中所有大于20的"级别"值,将结果限制为100并按rowid排序.
按rowid排序时,查询速度要慢得多.该数据库包含约300万条记录,级别的最大值为50.为级别创建索引.
这个陈述需要大约20ms:
SELECT * FROM log WHERE level > 20 LIMIT 100
Run Code Online (Sandbox Code Playgroud)
这个陈述需要大约100毫秒:
SELECT * FROM log WHERE level > 20 ORDER BY rowid LIMIT 100
Run Code Online (Sandbox Code Playgroud)
此语句需要约1000毫秒(不存在级别值大于50的行):
SELECT * FROM log WHERE level > 50 ORDER BY rowid LIMIT 100
Run Code Online (Sandbox Code Playgroud)
有没有办法优化这个以获得更快的ORDER BY查询?
这是使用的索引:
CREATE INDEX level_idx ON table (level)
Run Code Online (Sandbox Code Playgroud)
有两种可能的方法来执行此查询:
level>20在level_idx索引中搜索第一个条目,然后扫描以下所有条目并从表中获取每个相应的行.由于索引条目未按rowid顺序存储,因此必须对所有结果进行排序.然后可以返回前100个.
忽略索引.扫描表格的所有行(已按rowid顺序存储),并返回level列匹配的任何行.
数据库估计第二种方法更快.
如果您估计第一种方法更快,即,那么几行匹配level过滤器,那么获取和排序剩余行比在扫描表时忽略不匹配行更快,那么您可以强制数据库使用带有INDEXED BY子句的索引:
SELECT *
FROM log INDEXED BY level_idx
WHERE level > 20
ORDER BY rowid
LIMIT 100
Run Code Online (Sandbox Code Playgroud)
但是,如果您自己的估计是错误的,强制索引会导致可怕的减速.
| 归档时间: |
|
| 查看次数: |
4597 次 |
| 最近记录: |