2011-06-20 18 views
1


我有一個sqlite數據庫,目前有幾個表中最大的一個擁有超過10,000行。此表有四列:id,術語,定義,類別。我使用了FTS3模塊來加速搜索,這對我們有很大的幫助。但是,現在當我嘗試從表中獲取'下一個'或'上一個'行時,它比我在開始使用FTS3之前花費的時間更長。Android:當讀取下一個/上一個行時SQLite FTS3速度變慢

這是我如何創建虛擬表:

CREATE VIRTUAL TABLE profanity USING fts3(_id integer primary key,name text,definition text,category text); 

這是我如何獲取下/上一個行:

SELECT * FROM dictionary WHERE _id < "+id + " ORDER BY _id DESC LIMIT 1 
SELECT * FROM dictionary WHERE _id > "+id + " ORDER BY _id LIMIT 1 

當我運行在虛擬表中的這些語句:

  • 下一個字段取自〜300ms,
  • 上一屆是內取〜200ms的

當我與普通表(沒有FTS3創建的)做到這一點:

  • 下學期的內〜3ms的取,
  • 上期是取之內〜2ms的

爲什麼會出現是一個很大的區別?有什麼辦法可以提高這個速度嗎?

編輯:
我仍然無法使它工作!

回答

0

您創建的虛擬表格旨在提供全文查詢,它並不旨在使用PK快速處理標準查詢,其中cond銀行足球比賽。 在這種情況下,_id列沒有索引,所以SQLite可能會執行全表掃描。 下一個問題是你的查詢 - 這是完全沒有效率的。試試類似的東西(未經測試):

SELECT * FROM dictionary WHERE _id = (select max(_id) from dictionary where _id < ?) 

接下來你可以考慮重新設計你的應用。不要加載1行,也許你應該讓我們說40,將它們加載到內存中,並在其中一個末端少於n時加載背景數據。長時間的SQL操作對於用戶來說將變得不可見,即使它將持續3秒而不是0.3秒

0

如果您首先運行LIMIT 1,則可以完全刪除order by子句。這可能有幫助。然而,我不熟悉FTS3。

你也只是平了分配您的ID變量++或 - 和斷言'WHERE _id =「+編號+」 LIMIT 1" ,這將使得單一的查詢,而不是<或>

編輯。 :現在我回頭看看我輸入的內容,如果你這樣做,你可以完全刪除LIMIT 1,因爲你的_id是你的PK並且必須是唯一的。

嘿,看看,原始的where子句!

+0

感謝您的迴應。我已經嘗試了你所說的(首先減少/增加id,然後通過它獲取數據),並且有改進,但是如果我將添加過濾器(如果我想獲取屬於特定類別的術語),它將不起作用。我也發現用FTS3'WHERE _id MATCH'10''比'WHERE _id = 10'快很多。 – Marqs

相關問題