在INNODB表上使用带有多个插入的复合PRIMARY KEY或UNIQUE键

时间:2013-05-02 10:05:32

标签: sql performance insert indexing innodb

我一直试图解决这个问题,但到目前为止还没有运气。

哪一个更好:具有复合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语句的速度吗?我知道很多其他因素会影响这一点,即缓冲池等等。

1 个答案:

答案 0 :(得分: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

但是如果你基本上可以在单用户模式下运行,那么使用批量加载器加载具有 no 约束的表是最快的。然后使用ALTER TABLE语句添加约束。