簡體   English   中英

iPhone Sqlite3查詢太慢

[英]Iphone Sqlite3 Query too slow

您好,我真的對我的應用感到困惑。 我需要使用SQLITE3在帶有aprox 250.000行(50mb)的表中進行一個簡單的SELECT。 當我使用Iphone Simulator加載時,查詢需要3秒鍾左右的時間。 當我在設備上測試我的應用程序時,查詢需要90秒。 不幸的是,我無法在90秒的等待時間內發布我的應用程序。 我在這里發布我的代碼:

-(void) loadResults {

sqlite3 *database;
NSMutableString *street;
zone = [[NSMutableArray alloc] init];

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    const char *sqlStatement = [[NSString stringWithFormat:@"select street from streets "] UTF8String];
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {

            street = [NSMutableString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
            [zone addObject:street];
        }
    }   
    sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);}   

這就是我使用SQLITE3創建表的方式

CREATE TABLE streets (id INTEGER PRIMARY KEY, street TEXT, province TEXT, country TEXT, from TEXT, to TEXT, lat TEXT, lon TEXT);
CREATE INDEX strIndx on streets(street);

如您所見,沒有WHERE語句,它只是一個簡單的“ SELECT street FROM street”

請在這里我需要幫助預先感謝。

如果您有250,000行且僅具有3000個不同的結果,則數據庫中每個街道的平均訪問次數為83次。

也許將您的街道分成一個單獨的標准化表是適當的,每個值僅出現一次,然后通過ID從地址表中引用這些街道。 然后對於您的TableView,您可以僅拉回Streets表中的值。

如前所述,您可能還會遇到UI范式問題。 如果您的UI中有一個包含3000個條目的表,那么對於用戶而言可能非常繁瑣。 (想象一下,一次向下滾動一下筆勢到Yabar Street。)

您可能希望至少像以前建議的那樣延遲加載表。 或者,也許您可​​以允許用戶鍵入街道名稱,並提供Google建議類型的界面,並在鍵入時彈出潛在的匹配項。

你想做什么? 如您所知,您沒有WHERE語句,我假設您沒有執行任何操作,例如過濾Obj-C端的行。 因此,我唯一想到的就是您要嘗試做的事情(如果我錯了,請發表評論)是加載所有要顯示的行。 蘋果對此有一個非常簡單的標准建議-延遲加載表格。 基本上,在原始查詢中添加最多15行的限制,並有一種方法可以檢索更多行(通常這是一個表格頁腳,帶有藍色文字,表示“加載更多...”)。 替代地,這可以通過簡單地直到請求時才將單元加載到限制以下來實現(這將在用戶滾動到它們時發生)。

謝謝您的回答。Jared,我需要在UITableView中顯示所有街道,並讓用戶在UISearchBar中過濾搜索,或者只是讓他從列表中選擇搜索。 我已將查詢更改為

SELECT DISTINCT(street) from streets

這返回了3000行的結果,但是它花費的時間與不使用DISTINCT的時間相同,即90秒。 我也嘗試過“ GROUP BY street”,沒有好處。 但是,如果我添加.. LIMIT 3000,則結果是即時的。 我想查詢必須遍歷整個表才能獲得DISTINCT值,而這與LIMIT無關,是否可能與INDEX有關? 我怎么知道索引是否正常工作? 再次感謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM