2016-04-29 35 views
1

我有一個基本的反向查找表,其中ID是數字升序已經排序:查找已經按排序順序排列的大型靜態表(sqlite),最有效的策略是什麼?

id INT NOT NULL, 
value INT NOT NULL 

ID被不是唯一;每個ID都有5到25,000個關聯值。每個ID是獨立的,即,ID之間沒有關係。

該表格是靜態的。只讀,沒有插入或更新。該表有100-200萬條記錄。數據庫本身將在7-12GB左右。 SQLite的。

我會在此表中進行頻繁查找,並希望每個查詢的響應時間最快。查找只有一個方向的,無序的,並始終形式:

SELECT value WHERE id IN (x,y,z) 

什麼優勢的排序預購給我的數據庫效率方面?與典型的無序表格相比,我應該做什麼不同?我如何告訴sql它是一個有序列表?

index是什麼意思:在id上創建索引是否有必要,甚至有幫助?

[更新感謝戈登Linoff聚集評論]。據我所知,sqlite不直接支持聚集索引。 wiki說:「是否支持[聚簇索引]?不,但如果使用INTEGER PRIMARY KEY,它將充當聚簇索引。」在我的情況下,列ID不是唯一的...

回答

0

假設空間不是問題,您應該在(id, value)上創建索引。這應該足以滿足您的需求。

但是,如果表是靜態的,那麼我建議您在創建表時創建一個集羣索引。索引將具有相同的密鑰,(id, value)

+0

我找不到太多關於SQLite和聚集索引。我所看到的只是在sqlite維基上提到的(https://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning):「是否支持[聚簇索引]?不,但如果使用INTEGER PRIMARY KEY,它會充當一個聚集索引。「 – LunaiThi

+0

@LunaiThi。 。 。哎呀,我錯過了。那麼,一個普通的指數應該沒問題。 –

0

如果表恰好被排序,數據庫不知道這個,所以你仍然需要一個索引。

這是一個更好的主意,用一個WITHOUT ROWID table(什麼其他的DB調用一個聚集索引):

CREATE TABLE MyLittleLookupTable (
    id INTEGER, 
    value INTEGER, 
    PRIMARY KEY (id, value) 
) WITHOUT ROWID; 
+0

來自sqlite.org:「WITHOUT ROWID表將正確工作(也就是說,它們提供了正確的答案),只有一個INTEGER PRIMARY KEY表,但普通的rowid表在這種情況下運行得更快,因此,它是良好的設計,以避免創建WITHOUT ROWID表與單列PRIMARY KEY類型INTEGER「...所以,是一個複合KEY(ID,值)比單列KEY(ID)更好?它只是在1個表(索引)中進行1次查找,而不是2次查找。如果組合鍵更好,WITHOUT ROWID的組合效果會更好嗎?在測試中,它與我的數據沒有多大區別。 – LunaiThi

+0

您的表沒有單列主鍵(因爲'id'不是唯一的),因此詢問它是否會更好是沒有意義的。單獨的索引需要更多的存儲空間。 –