索引如何帮助加快SELECT查询

时间:2013-08-17 15:36:58

标签: android sqlite optimization indexing

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创建了索引。

enter image description here

如何使用创建的索引加速从大表(大约20MB)的数据检索?

3 个答案:

答案 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

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

    CREATE INDEX ele_value_idx ON search_eng(r_ele_value COLLATE NOCASE)