簡體   English   中英

在具有多個插入的INNODB表上使用復合PRIMARY KEY或UNIQUE鍵

[英]Using composite PRIMARY KEY or UNIQUE key on INNODB table with multiple inserts

我一直在試圖解決這個問題,但是到目前為止還沒有運氣。

哪個更好:帶復合PRIMARY KEY或單個PRIMARY KEY和UNIQUE索引的表?

我的桌子看起來像這樣:

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

我正在多次插入。 60億+行將以以下形式插入到多值插入中

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

每個中有500000行(受客戶端限制)。 這些都是在應用程序啟動時完成的,目前,我需要盡可能加快速度。 我需要(backend_id,unique_id)的唯一性。 盡管我不控制這些,所以導入的數據中存在重復項。

所以問題是,使用UNIQUE索引而不是復合PRIMARY KEY可以幫助我提高insert語句的速度嗎? 我知道許多其他因素會影響此,例如緩沖池等。

我非常確定,所有現代數據庫管理系統中的主鍵約束都是使用唯一索引實現的。 在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語句添加約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM