sqlite - 如何在android中为sqlite查询引入索引?
问题描述
在我的 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 应用程序也很难找到这方面的示例。
解决方案
start_time
您可以为列和创建复合索引stop_time
:
CREATE INDEX idx_name ON table_name(start_time, stop_time);
您可以阅读SQLite 查询优化器概述:
内部连接的 ON 和 USING 子句在 WHERE 子句分析之前转换为 WHERE 子句的附加术语...
和:
如果使用如下语句创建索引:
CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);
然后,如果索引的初始列(列 a、b 等)出现在 WHERE 子句术语中,则可以使用该索引。索引的初始列必须与 = 或 IN 或 IS 运算符一起使用。 使用的最右边的列可以使用不等式。
您可能必须从设备上卸载应用程序,以便删除数据库并重新运行以重新创建它,或者增加数据库的版本号以便您可以在onUpgrade()
方法中创建索引。
推荐阅读
- javascript - 错误:拒绝在框架中显示“https://beta.app.com”,因为它将>“X-Frame-Options”设置为“sameorigin”
- java - 如果不是,我该如何优化以下内容?
- ios - iOS 13 导航栏样式:设备和模拟器之间的巨大差异
- pandas - 基于条件的随机数据生成 pandas 和 numpy
- php - 如何使用按日期和用户名分隔的while循环添加列的不同值(行)
- css - SCSS:更改父母的另一个孩子的可见性
- math - 查找涉及对数总和的大 O
- swift - 以变量为键访问字典值:Swift
- javafx - netbeans 8.2 javafx 创建 exe 文件
- mysql - 如何在 MySQL 5.7 中的 JSON 数组中获取唯一/不同的元素