SQLite查询性能

时间:2015-07-09 12:43:32

标签: android performance sqlite

我是SQLite的新手,我需要尽可能高效的查询。我有一个存储各种天文物体位置的数据库,我想通过我的真实主要时间键来访问它们的位置。我的查询类似于

    SELECT * FROM positions ORDER BY ABS(t-t0) LIMIT 1;

其中t0是我想看到位置的时间。这个查询使用主键,我认为这使它足够有效但我不知道ORDER BY ABS(...)的数学运算是否会减慢搜索速度,即使我怀疑这意味着全表扫描。

第一个问题:REAL PRIMARY KEY对于普通的INTEGER PRIMARY KEY来说是一个效率问题吗?

第二个问题:如果我能从我的Android应用程序代码中找到想要的PRIMARY KEY t0并执行以下查询:

    SELECT * FROM positions WHERE t = t0;

我会提高效率吗?在这种情况下没有全表扫描,对吗?

1 个答案:

答案 0 :(得分:1)

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在临时结果上执行,该结果只有两行。