query = "SELECT id AS _id, entry_id, r_ele_value, k_ele_value, gloss_value FROM search_eng WHERE r_ele_value LIKE '"+hiragana+"%' LIMIT 20";
此查询工作非常慢。所以我在SQLite Expert Professional中为r_ele_value创建了索引。
如何使用创建的索引加速从大表(大约20MB)的数据检索?
答案 0 :(得分:1)
理论上Query Planner应该自动使用你的索引。
大多数情况下,SQLite中的查询规划器在它上面做得很好 拥有,没有外界的帮助。但是,查询计划程序需要索引 与...一起工作通常是程序员添加索引 足以让查询计划程序完成其的模式 任务。
此外,您可能对Query Optimizer Overview文章感兴趣,还有一些在查询执行方式中描述的其他详细信息。
答案 1 :(得分:0)
对于大型数据库中的搜索,您实际上应该使用SQLite查看FTS3表。此扩展程序用于执行全文搜索,效率高于LIKE
。
以下链接解释了Android应用中的搜索: http://developer.android.com/guide/topics/search/search-dialog.html#PerformingSearch
此链接显示如何创建和访问用于查询的虚拟表: http://developer.android.com/training/search/search.html
此外,此博客上的完整示例: http://blog.andresteingress.com/2011/09/30/android-quick-tip-using-sqlite-fts-tables/
基本上必须创建一个虚拟表,例如此查询:
private static final String FTS_TABLE_CREATE =
"CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE +
" USING fts3 (" +
COL_WORD + ", " +
COL_DEFINITION + ")";
然后可以使用下面的函数getWordMatches
检索游标:
public Cursor getWordMatches(String query, String[] columns) {
String selection = COL_WORD + " MATCH ?";
String[] selectionArgs = new String[] {query+"*"};
return query(selection, selectionArgs, columns);
}
private Cursor query(String selection, String[] selectionArgs, String[] columns) {
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(FTS_VIRTUAL_TABLE);
Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
columns, selection, selectionArgs, null, null, null);
if (cursor == null) {
return null;
} else if (!cursor.moveToFirst()) {
cursor.close();
return null;
}
return cursor;
}
所有这些都来自Android文档,请参阅上面的链接。
答案 2 :(得分:0)
能够use an index with a LIKE
prefix lookup,
TEXT
affinity,即声明为TEXT
或VARCHAR
或类似的内容;和索引必须不区分大小写:
CREATE INDEX ele_value_idx ON search_eng(r_ele_value COLLATE NOCASE)