我一直试图解决这个问题,但到目前为止还没有运气。
哪一个更好:具有复合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语句的速度吗?我知道很多其他因素会影响这一点,即缓冲池等等。
答案 0 :(得分:0)
我很确定所有现代数据库管理系统中的主键约束都是使用唯一索引实现的。在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
但是如果你基本上可以在单用户模式下运行,那么使用批量加载器加载具有 no 约束的表是最快的。然后使用ALTER TABLE
语句添加约束。