2009-08-06 111 views
3

我有一個sqlite數據庫用於存儲有關備份作業的信息。每次運行,由於將大約32,000個條目添加到特定的表中,它增加了約25mb。主鍵對SQLite性能的影響

此表是一個「映射表」,用於將某些信息鏈接到另一個表中的記錄......並且它有一個我不使用的主鍵(autoincrement int)。

sqlite將根據其值保留INT列的1,2,4或8個字節。該表只有3個額外的列,也是INT類型。

我在我的查詢中用作過濾器(WHERE)的列上向數據庫添加了索引。

在存在索引等情況以及所描述的情況下,主鍵在性能方面是否有用?

注意:性能對於此項目非常重要 - 但如果在32,000入門級別上保存10ms意味着額外需要10MB數據,則不會這麼做!

回答

2

主鍵索引用於查找給定主鍵的行。它也用於確保主鍵值是唯一的。

如果您使用其他列搜索數據,則不會使用主鍵索引,因此不會產生性能優勢。不過,它的存在也不應該對性能產生負面影響。

一個不必要的索引會浪費磁盤空間,並使INSERT和UPDATE語句執行速度變慢。它不應該對查詢性能產生負面影響。

+0

我主要贊同這一點。重要的想法是將數據庫保存在內存中,如果索引太大,那麼它可能很重要。 – Unknown 2009-08-06 07:32:39

+0

@未知:對於一個普通的磁盤備份的內存緩存數據庫,未使用的索引不應該進入內存,如果他們這樣做,很快就會被驅逐。但是,是的,如果你正在構建一個完整的內存數據庫而沒有後備磁盤存儲,這些索引可能會傷害你。 – Thilo 2009-08-06 07:41:05

0

如果你真的不使用這個ID什麼不放這個列+主鍵?保持未使用的主鍵id列存活的唯一原因是爲了能夠與另一個表創建主從關係。

另一種可能性是保留列但刪除主鍵。這意味着應用程序必須注意爲每個插入語句提供一個唯一的ID。在每批操作之前和之後,您必須檢查此列是否仍然是唯一的。由於多個併發問題,這在例如MySQL和Oracle中不起作用,但它在sqlite中起作用。