在数据库上执行VACUUM可以大大提高查询性能。在尝试确定原因时,我发现sqlite3并未使用数据库的原始状态下的索引,而只是使用通用的SEARCH TABLE。
QUERY PLAN
|--SCAN TABLE data <--- no Index
|--USE TEMP B-TREE FOR GROUP BY
`--USE TEMP B-TREE FOR ORDER BY
执行VACUUM后,QUERY PLAN将显示应该使用的搜索索引
QUERY PLAN
|--SEARCH TABLE data USING INDEX index_name (name=?)
|--USE TEMP B-TREE FOR GROUP BY
`--USE TEMP B-TREE FOR ORDER BY
如何确定为什么在真空操作之前不使用索引?
我也有解释结果,但是我不确定它们是否有用。它们显然是不同的(原始的非真空结果执行了倒带/循环,而真空DB OpenRead的索引就是该值)
谢谢