0
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)中检索数据?

4

3 回答 3

1

理论上,查询计划器应该自动使用您的索引。

大多数情况下,SQLite 中的查询计划器在没有外部帮助的情况下独立完成工作。但是,查询规划器需要使用索引,并且通常由程序员向模式中添加足以让查询规划器完成其任务的索引。


此外,您可能对查询优化器概述文章感兴趣,在如何执行查询中描述了一些其他详细信息。

于 2013-08-17T15:41:34.583 回答
0

为了能够使用带有LIKE前缀查找的索引,

  1. 该列必须具有TEXT affinity,即声明为TEXTorVARCHAR或类似的东西;和
  2. 索引必须不区分大小写:

    CREATE INDEX ele_value_idx ON search_eng(r_ele_value COLLATE NOCASE)
    
于 2013-08-17T17:23:50.207 回答
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 文档,请参见上面的链接。

于 2013-08-17T16:43:14.033 回答