2010-09-01 31 views
3

我正在創建一個應用程序,它將從SQLite數據庫中獲取數據並將其顯示在表中。SQLite - 爲每個字段創建和索引

我希望在用戶做出選擇(通過多個下拉框)時實時更新表格。每次用戶從下拉框中選擇一個選項時,應用程序都必須創建一個新的SELECT查詢,並添加,刪除或更改新的WHERE子句。該表格將顯示查詢結果,因爲從下拉框中選擇了一個項目。

我的問題是,爲了使讀取過程更快應該我/我可以索引每個表中的每個字段?我不確定這是否可能。

我不需要擔心INSERT,ALTER等性能問題,因爲很少會添加新數據。

謝謝

+0

我想按字段你的意思列。據我所知,字段是由行號與列號的交集定義的。 – thelost 2010-09-01 09:50:03

回答

5

我想你應該先看看SELECT查詢的性能是否會真的成爲問題。索引可能會佔用大量空間(有時甚至超過實際數據),因此不要嘗試過早優化(請記住,您可以隨時添加索引而不更改其他任何內容)。

如果您實際上看到問題,您可以嘗試在WHERE子句中使用的字段中添加索引,從最多查詢的字段開始。

2

您是在將每一列都搜索到後?真?沒有索引的查詢太慢了?噢,如果你的數據變化和你所說的一樣罕見,建立這些索引(假設它們是一種類型,那麼索引是自然而然的)。雖然空間成本會非常高,但一旦達到索引不適合內存的大小(以及其他重要的事情,如程序和操作系統),那麼你就會轉而使用磁盤無論如何,一切都會減慢。

但是,不要優化,直到你已經測量真實數據的問題。過早優化是所有邪惡的立方體根源。

1

在每個字段中不添加索引不會使其更快 - 系統一次只能使用一個索引。如果該列僅包含幾個不同的值(例如,客戶的出生年份),那麼使用索引將低於通過讀取表中的每個記錄並丟棄不匹配的記錄。 OTOH如果用戶通過表的主鍵進行過濾,那麼索引將非常非常高效。

在每個字段組合上添加一個索引將使其更快 - 但是(N + 1)!索引。這將需要大量存儲空間,並大量減慢任何DML。

最好的折衷辦法是

  1. 需要默認一些過濾
  2. 建立索引相配套的常用選擇標準(包括「默認」過濾)
  3. 日誌評選標準和查詢時間,以確定它如何能待改進

C.

+0

字段只有「2^N-1個可能的組合」。 – dan04 2010-09-01 14:28:08

+0

否 - 有2個字段可能的索引是(a),(b),(ab),(ba)。 (a),(b),(c),(ab),(ba),(ac),(bc),(ca),(cb),(abc),(bca),(cba), (出租車)。等等,實際上比(N + 1)增加更快!當然一個LOT大於2^N-1。還是你建議有一個支持跳過掃描操作的SQLite版本? – symcbean 2010-09-01 16:38:06

2

我的問題是,爲了使 提取過程更快應該我/我 指數在每個表的每個字段?我是 不確定這是否可能。

是的,這是可能的。你是否應該應該取決於你有多少磁盤空間;索引可以是巨大的

0

實現此目的的最佳方式是在表加載時拉下所有數據並填充表。然後,只需在表格列中添加過濾器,並讓您的下拉列表與過濾器聯繫,而不是每次都進入數據庫。

相關問題