![](/img/trans.png)
[英]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.