【问题标题】:How to introduce indexing to sqlite query in android?如何在android中为sqlite查询引入索引?
【发布时间】:2021-10-15 03:25:14
【问题描述】:

在我的 android 应用程序中,我使用 Cursor c = db.rawQuery(query, null); 从本地 sqlite 数据库中查询数据,query 字符串之一如下所示:

SELECT t1.* FROM table t1
WHERE NOT EXISTS (
  SELECT 1 FROM table t2
  WHERE t2.start_time = t1.start_time AND t2.stop_time > t1.stop_time
)

然而,问题是当数据库变大时查询会变得很慢。试图考虑引入indexing 以加快查询速度,但到目前为止,还不是很成功,因此,在这里能得到一些帮助会很棒,因为对于 android 应用程序也很难找到这方面的示例。

【问题讨论】:

    标签: sqlite indexing android-sqlite


    【解决方案1】:

    您可以为start_timestop_time 列创建复合索引:

    CREATE INDEX idx_name ON table_name(start_time, stop_time);
    

    您可以在The SQLite Query Optimizer Overview阅读:

    内连接的 ON 和 USING 子句转换为 WHERE 子句分析之前的 WHERE 子句的附加条款 ...

    和:

    如果使用这样的语句创建索引:

    CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);
    

    如果索引的初始列可能会使用索引 (列 a、b 等)出现在 WHERE 子句术语中。最初的 索引的列必须与 = 或 IN 或 IS 运算符一起使用。 使用的最右边的列可以使用不等式。

    您可能需要从设备上卸载应用程序,以便删除数据库并重新运行以重新创建它,或者增加数据库的版本号以便您可以在onUpgrade() 方法中创建索引。

    【讨论】:

    • 非常感谢您的回答,又是一个小问题,添加复合索引的创建后,查询字符串是否保持不变?
    • @user3442437 查询保持不变。使用索引由查询规划器决定。
    • 我还有一个问题,除了索引之外,我还能做些什么来加快查询速度?
    • @user3442437 当然有。您可以尝试不同的方法来获得相同的结果并比较速度。 SQLite 从 3.25.0 版本开始也支持窗口函数,可以用来代替 EXISTS 并提供更好的性能,但不幸的是,直到 API 级别 29,Android 使用 SQLite 版本 3.22.0
    • @user3442437 不,这不正常。这是一个小数据集。
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多