我是 SQLite 的新手,我需要尽可能高效的查询。我有一个存储各种天文物体位置的数据库,我想通过我的 t REAL PRIMARY KEY 即时间访问它们的位置。我的查询是这样的
SELECT * FROM positions ORDER BY ABS(t-t0) LIMIT 1;
其中 t0 是我想查看位置的时间。此查询使用主键,我认为这使其足够有效,但我不知道 ORDER BY ABS(...) 的数学运算是否会减慢搜索速度,尽管我怀疑这意味着全表扫描。
第一个问题:REAL PRIMARY KEY相对于普通的INTEGER PRIMARY KEY是效率问题吗?
第二个问题:如果我能从我的 android 应用程序代码中找到想要的主键 t0 并执行如下查询:
SELECT * FROM positions WHERE t = t0;
我会提高效率吗?在这种情况下没有全表扫描,对吗?
最佳答案
INTEGER PRIMARY KEY 比其他类型稍微高效一些,但如果您的值不适合 INTEGER,您别无选择。
一般情况下,SQLite 不能使用索引来优化函数调用。
简单的查找确实会更有效,但可以重写原始查询以在访问表时仅使用基本比较:
SELECT *
FROM (SELECT *
FROM positions
WHERE t >= t0
ORDER BY t ASC
LIMIT 1)
UNION ALL
SELECT *
FROM (SELECT *
FROM positions
WHERE t < t0
ORDER BY t DESC
LIMIT 1)
ORDER BY ABS(t - t0)
LIMIT 1
最终的 ORDER BY 是在只有两行的临时结果上执行的。
关于android - SQLite 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31317897/