2013-05-02 51 views
0

我一直在試圖弄清楚這一點上InnoDB表UNIQUE關鍵,但至今沒有運氣。使用複合主鍵或具有多個刀片

哪一個更好:與複合主鍵或一個主鍵和一個唯一索引的表?

我的表看起來像這樣:

CREATE TABLE data (
    bucket_id INTEGER, 
    backend_id INTEGER, 
    unique_id INTEGER, 
    weight INTEGER, 
    PRIMARY KEY (bucket_id, unique_id) 
) ENGINE=InnoDB 

我做多個插入。在多值插入到被插入在

INSERT IGNORE INTO data VALUES (x1, x2, x3, x4), (y1, y2, y3, y4), .......) 

外殼6個十億+行與每個500000行(由客戶端的限制)。這些都是在應用程序啓動時完成的,目前我需要儘可能加快速度。我需要(backend_id,unique_id)的唯一性。雖然我不控制這些,所以導入的數據中有重複。

所以現在的問題是,將使用組合主密鑰的唯一指標,而不是幫助我提高插入語句的速度?我知道很多其他因素影響這個,即緩衝池等。

+0

*「哪一個更好?用複合主鍵或一個主鍵和一個唯一索引的表」 *什麼會「單一主鍵」是什麼? – 2013-05-02 10:20:47

+0

*「我需要(backend_id,unique_id)的唯一性,雖然我不控制這些,所以導入的數據中有重複。」*這是否意味着您需要修復或忽略不良數據? – 2013-05-02 10:21:21

+0

單字PRIMARY KEY將是bucket_id。沒有數據沒有問題,但數據的唯一性依賴於需要導入的更多列,所以如果兩行相互衝突,那麼backend_id和weight將是相同的,因此忽略第二行是安全的。 – Moffe 2013-05-02 10:42:07

回答

0

我敢肯定,在所有的現代數據庫管理系統中的主鍵約束使用唯一索引實現的。在SQL中,聲明PRIMARY KEYNOT NULL UNIQUE在行爲上是等效的。

你的問題歸結爲:使用代理鍵另外對{backend_id,unique_id}上的必要約束更快嗎?請注意,使用代理鍵而不是{{backend_id,unique_id}}上的必要約束通常是不可接受的,因爲它忽略了重要的業務需求。

添加代理鍵

  • 使得表更寬,
  • 增加了必須被寫入表的字節數,和
  • 增加了必須被寫入索引的數量。

因此增加了代理鍵可能會減慢你的速度。如果您需要併發訪問,這可能是您所述要求的最佳結構

CREATE TABLE data (
    backend_id INTEGER, 
    unique_id INTEGER, 
    weight INTEGER, 
    PRIMARY KEY (backend_id, unique_id) 
) ENGINE=InnoDB 

但如果你能在單用戶模式運行的本質,它的最快加載表沒有限制,使用批量加載器。然後在ALTER TABLE聲明中添加約束條件。

+0

對不起,如果我不清楚,我很抱歉。但問題不在於SQL語法,而在於執行大量插入操作時,後面的建議是否更快。 – Moffe 2013-05-02 13:23:43

+0

@Moffe:更新了我的答案。 – 2013-05-02 14:21:04