2013-08-17 23 views
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的索引。索引如何幫助加快SELECT查詢

enter image description here

如何使用創建的索引來加快數據檢索,從大的表(約20MB)?

回答

1

理論上Query Planner應該自動使用您的索引。

大多數時候,SQLite中的查詢計劃員在自己的 上做得很好,沒有外部幫助。但是,查詢計劃員需要使用索引 來處理,並且通常由程序員將索引添加到查詢計劃程序完成其 任務所需的模式。


此外,您可能會在Query Optimizer Overview文章中insterested,也有查詢是如何進行的描述了一些額外的細節。

+0

謝謝@dst的鏈接,我會閱讀並優化我的查詢 –

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文檔到來,見上文鏈接。

0

爲了能夠use an index with a LIKE prefix lookup

  1. 列必須有TEXTaffinity,即聲明爲TEXTVARCHAR或類似的東西;和
  2. 指數必須是不區分大小寫:

    CREATE INDEX ele_value_idx ON search_eng(r_ele_value COLLATE NOCASE) 
    
+0

如何使用創建的索引?或者只是調用索引列就足夠了? –

+0

索引自動使用。請查看[解釋查詢計劃](http://www.sqlite.org/eqp.html)。 –