2012-08-16 31 views
1

我有一個表,看起來像這樣用sqlite創建。SELECT查詢的良好性能的主要選擇

CREATE TABLE Cars ( 

POWER DOUBLE , 
CAPACITY DOUBLE, 
SPEED DOUBLE, 
TIME INTEGER NOT NULL, 
TYPE INTEGER NOT NULL, 
MODEL INTEGER NOT NULL, 

PRIMARY KEY (TIME, TYPE, MODEL)); 

TYPE有15個不同的值,每種類型有20個不同的MODEL值。 對於每個模型,每10秒插入一條新記錄。

一個小例子:

POWER----TIME----TYPE----MODEL 
45.6  2588  3  14 
46.8  2588  3  15 
44.7  2588  3  16 

此表是與數百萬行的真正巨大的。

正如你可以看到我的主鍵是(TIME, TYPE, MODEL),因爲這是一個獨特的標識符。

我的應用程序多次運行select查詢,當時間範圍很大時,或者如果我爲多個模型運行查詢,這可能需要很長時間。

比如我運行這種類型的查詢往往:

SELECT power, time, type, model 
FROM CARS 
WHERE type = 3 AND model = 14 AND time BETWEEN 2588 and 13550; 

我曾嘗試與像(TYPE, MODEL, TIME)這增加了性能的一些情況,但不是在一個大的時間間隔主鍵進行試驗。

我的問題是我如何優化記錄的檢索,以及哪種主鍵似乎對這種情況是最佳的?

插入和更新不是性能方面的問題。

+0

你的索引是什麼? – 2012-08-16 12:04:11

+0

使用索引來提高性能 – 2012-08-16 12:05:18

+0

那麼,我使用的唯一索引類型就是主鍵。對不起,如果這是你的意思? – 2012-08-16 12:08:54

回答

1

您的主鍵中的字段順序應該反映每個選項的選擇性(首選性最高)。

從表面上看,時間似乎應該是第一位的,因爲在特定時間選擇會比特定類型或模型返回更少的記錄。

然而,如果大多數或所有的疑問都將選擇一個範圍倍,那麼這將是最好有在端的主鍵時,因爲選擇範圍是小於選擇性具體的價值。

我建議將主鍵更改爲(型號,類型,時間) - 按此順序。

1

在MSDN上提供的關於組合鍵的一般指導是,您將具有最高基數(即大多數唯一值)的列放在鍵/索引的根部。

所以你的情況,關鍵應該是因爲你擁有了它 - 即:

CREATE TABLE Cars ( 
    PRIMARY KEY (TIME, TYPE, MODEL), 
    POWER DOUBLE , 
    CAPACITY DOUBLE, 
    SPEED DOUBLE, 
    TIME INTEGER NOT NULL, 
    TYPE INTEGER NOT NULL, 
    MODEL INTEGER NOT NULL 
); 

這將的,你知道時間的價值查詢表現良好。

+0

好的。我總是知道時間範圍,所以這不是問題。所以我想我不能真正提高性能:/ – 2012-08-16 12:18:07

+0

@ Ole-M:如果你總是選擇一個*範圍的時間而不是一個特定的時間,那麼它會更有意義首先放置**其他**字段(假設你只是選擇特定的類型和型號值)。 – 2012-08-16 12:21:39

+0

@ MarkBannister好的。我將永遠選擇一個時間響。但是每隔10秒鐘插入300(15 * 20)個不同的值。那麼每個具有300個值的串將按照(模型,類型,時間)進行排序,但是當下一個300個值被插入時,順序將首先以類型nr 1開始。因此,無論如何,整個數據庫不會在(模型,類型,時間)上排序,除非在我用所有插入方式進行篩選時有辦法做到這一點? – 2012-08-16 12:37:26