升级到Android L后,SQLite数据库会在<表名>(列)上自动创建索引,出现警告。

48

我已经将我的Nexus 7升级到Android 5.0棒棒糖,之前我的应用程序在SQLite数据库上运行良好,但现在无论我执行任何类型的查询,都会给我日志错误,例如:

12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.942: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.960: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on area(server_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on account(area_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on staff_visit(account_id)
12-09 12:37:04.978: E/SQLiteLog(13041): (284) automatic index on ordertab(account_id)

那么这是任何棒棒糖错误吗?我认为是因为在升级操作系统之前和之后我都没有更新过我的代码。


顺便提一下,自动索引是很好的,可以提高查询性能。 - Muhammad Babar
很奇怪,虽然我已经手动为我的搜索或连接列创建了索引,但自动索引仍在被创建。 - Muhammad Babar
2个回答

79

自动索引在sqlite 3.7.17中被引入。拥有此功能的sqlite版本只在Android L开发者预览版中被包含。这就是为什么你只会在Lollipop上收到这个消息而不是之前的Android版本。即使它被记录为错误,但它实际上只是一条消息。

基本上,当您在非索引列上进行查找时,自动索引就会起作用。sqlite假设数据量很大,生成临时索引比原始查找更廉价。

考虑使用CREATE INDEX为您的查找列添加显式永久索引。例如,在您的CREATE TABLE之后:

CREATE INDEX indexname ON tablename(columnname);

您可以从sqlite生成的自动索引消息中选择tablename(columnname)

如果您只是想恢复旧的行为,可以使用以下方法禁用自动索引:

PRAGMA automatic_index=off;

2
@MuhammadBabar 这取决于数据量和读写比例。 - laalto
我的查询中有5个连接,带有group by和聚合函数group_concat。它没有任何WHERE子句。索引能在连接上提供帮助吗? - Muhammad Babar
3
尽管我已经在那个表格列上创建了索引,但我不明白为什么我仍然会收到这些消息。 - AntonSack
@AntonSack 你确定你的索引创建已经运行了吗? - laalto
5
当开发人员无法理解错误日志的含义时,我感到很烦恼...这会污染我的 Logcat 输出!它应该只是一个信息日志或者最多是警告。 - Raphael Royer-Rivard
显示剩余9条评论

2
我在调查这个问题时发现了这篇帖子。虽然我有一个C#项目,它可能与OP无关,但我认为它可能对其他人有帮助。
对于那些想知道为什么消息仍然出现的人,尽管显式创建了索引;也许您的查询正在使用不同的排序规则。
我有一个带有文本列的表格和一个带有where语句的select查询,其中指定了where name = @var1 COLLATE NOCASE。这触发了警告,因为我创建的索引是默认排序。
因此,重写索引或创建表语句来指定该列的nocase,就可以消除警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接