2012-02-20 56 views
1

對不起,我只是玩弄mysql和學習,隨着我走。這是我的問題。我有一個表(在Python中)與數值(例如{3:1,3:2,3:3})。我想使用數據庫作爲這些變量的持久性存儲(因爲它們不能完全適應內存),但我想盡可能快地嘗試使用它。我可以讓兩列彼此獨一無二嗎?

目前我只在mysql中使用一列(索引),並且字典中的每個條目都有自己的行。如果我使用兩列INT而不是CHAR列,我想嘗試查看是否可以加快讀/寫速度,但是我需要兩列彼此是唯一的。在上面的例子中,所有的數據都是唯一的,如果我再添加3 = 1,那麼它會覆蓋現有的值,但是3 = 4會創建一個新的條目。我怎樣才能在MySQL中複製?

另外我的加速邏輯有道理,還是兩列的選擇實際上最終會比有一個更昂貴?

我從頭開始構建,所以您不必在現有解決方案中工作,我非常靈活地採取任何可行的方法。

謝謝!

+1

你在找複合主鍵嗎? – Asdfg 2012-02-20 20:04:08

+0

我建議將'varchar'分成兩個'ints' ...不是出於性能原因,而是[適當的規範化](http://en.wikipedia.org/wiki/Database_normalization)。首先,讓它工作 - 第二,做對 - 最後,擔心讓它變快。 – 2012-02-20 20:06:32

+0

@Asdfg我認爲是這樣,現在我只有一列,所以我想看看我是否可以拆分它。 @邁克爾我試圖給它一個鏡頭。現在它已經可以工作了,但我覺得mysql可以更快,所以我只是測試不同的方法,並將其與以前的結果進行比較(並確保結果相同)。 – Lostsoul 2012-02-20 20:10:45

回答

4

短版本是,你可以在一個唯一索引

// Create the test table 
CREATE TABLE testTable (
    col1 INT UNSIGNED NOT NULL, 
    col2 INT UNSIGNED NOT NULL, 
    col3 VARCHAR NOT NULL, 
    PRIMARY KEY (col1,col2) 
); 

,將與名uniqueOnCol1AndCol2添加列到表TestTable的多個列。然後,您可以使用您的INSERT查詢,如下所示:

INSERT INTO testTable (
    col1, 
    col2, 
    col3 
) VALUES (
    3, 
    1, 
    'Original value' 
) ON DUPLICATE KEY UPDATE 
col1 = VALUES(col1) 

這會在testTable中插入(3,1'原始值')。然後用

INSERT INTO testTable (
    col1, 
    col2, 
    col3 
) VALUES (
    3, 
    1, 
    'New value' 
) ON DUPLICATE KEY UPDATE 
col1 = VALUES(col1) 

後續會覆蓋COL3,使之「新價值」

+0

令人驚訝的是,我沒有意識到這是可能的。謝謝。 – Lostsoul 2012-02-20 20:07:20

+0

對不起,有點問題。我其實並不需要第三欄。只有前兩個(我有每行數組)。當我嘗試在上面的命令中添加這兩組數字時,它適用於3,1,但如果我嘗試添加3,2,那麼col1會出現重複的主鍵錯誤。有道理,但有沒有辦法繞過它使用col1和col2作爲聯合類型的主鍵? – Lostsoul 2012-02-20 20:49:14

+0

我已經更新了示例 - 我忘記了PK,所以將PK更改爲col1,col2 - 它的功能與防止重複col1,col2組合的目的相同,col3只是可以扔掉不需要 – 2012-02-20 20:52:02

2

做一雙獨特的列,聲明上都列的唯一索引。 是這樣的:

create unique index myindex on mytable(col1, col2)

1

使用UNIQUE約束爲列和使用REPLACE代替INSERT。不知道您所談論的性能優勢以及varchar從何而來。

相關問題