[英]mySQL Composite Key, Primary Key, Unique Key and References to the composite key
[英]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 KEY
和NOT 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.