android - SQLite 查询性能

标签 android performance sqlite

我是 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/

相关文章:

java - 调试 Android 应用程序(在 Eclipse 中)

java - eclipse 无法识别 id 或文件

css - CSS 如何对网页特定区域的页面绘制时间产生显着的负面影响?

java - 从数据库重新加载列表或将其存储为 Parcelable?

java - 为什么 SQLite 处理必须发生在 Activity 或服务类上?

android - 如何在使用缩放和拖动手势时将图像保持在屏幕范围内?

android - 禁用从纵向到横向的默认动画

linux - 如何在 Linux 上使用 Vtune Analyzer API

performance - 为什么.Net 4.0中新的Tuple类型是引用类型(类)而不是值类型(结构)

xcode - 将 SQLite3 数据库逆向工程到 coredata