在 innoDB 中强制隐藏聚集索引

Force hidden clustered index in innoDB

我有一个 table,其 ID 是 "true primary key" 的散列。如果我错了请纠正我,但我认为我在这个 table 中的插入非常慢,因为这个键上有聚集索引(插入 100 000 行需要几分钟)。 当我将键更改为非聚集索引时,我的印象是 innoDB 仍然秘密地在其上聚集。

有没有一种简单的方法可以避免 mysql 聚集在我的主键上而不必定义自动递增主键?

InnoDB 必须有一个PRIMARY KEY.

  1. Innodb 的首选是显式 PRIMARY KEY,无论 AUTO_INCREMENT 与否。
  2. 然后是 UNIQUE 键,但前提是 none 列是 NULLable.
  3. 最后,InnoDB 将创建一个隐藏的 6 字节整数,其作用有点像 auto_increment。

场景 1. 插入到一个 table 中必须找到所需主键所在的块。对于上面的 AUTO_INCREMENT 和 #3,这将是 table 中的 "last" 块。 100K 行将在 table 的 "end" 处进入大约 1000 个块。

场景2。否则(非AI,但显式PK;或UNIQUE),需要找到一个块(可能从磁盘读取),密钥检查dup,然后更新块并标记为以后重写到磁盘。

如果所有块都适合 buffer_pool,那么它们中的任何一个基本上都是相同的速度。但是如果 table 太大而无法缓存,那么场景 2 会变慢——实际上随着 table 的增长越来越慢。这是因为 I/O。 GUID、UUID、MD5 和其他散列因遭受这种减速而臭名昭著。

另一个问题:交易完整性决定了每笔交易都会产生一些其他问题 I/O。您的 100K 插入是 100K 交易吗? 1笔交易?最好是将它们以每个事务 100 到 1000 行为一组进行批处理。

希望这些原则能让你弄清楚自己的处境。如果不是,请为您正在考虑的每个选项提供 CREATE TABLE。然后我们可以讨论你的细节。还要提供 SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; 以及您有多少 RAM。