0

我一直试图弄清楚这一点,但到目前为止还没有运气。

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

4

1 回答 1

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

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

于 2013-05-02T11:01:41.793 回答