在innoDB中强制隐藏聚簇索引

时间:2016-07-20 08:52:13

标签: mysql sql innodb mariadb

我有一个表格,其ID是"真正的主键"的哈希值。如果我错了,请纠正我,但我认为我的插入在这个表中非常慢,因为此键上的聚集索引(插入100 000行需要几分钟)。 当我将密钥更改为非聚簇索引时,我的印象是innoDB仍在秘密地聚集在其上。

是否有一种简单的方法可以避免主键上的mysql集群而无需定义自动增量主键?

1 个答案:

答案 0 :(得分:2)

InnoDB 必须拥有PRIMARY KEY

  1. Innodb的第一个偏好是明确的PRIMARY KEY,无论是否AUTO_INCREMENT
  2. 然后是UNIQUE键,但前提是这些列都不是NULLable
  3. 最后,InnoDB将创建一个隐藏的6字节整数,其行为有点像auto_increment。
  4. 场景1.插入表必须找到所需主键所在的块。对于AUTO_INCREMENT和上面的#3,这将是表格中的“最后”块。 100K行将进入表格“末尾”的大约1000个区块。

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

    如果所有块都适合buffer_pool,则其中任何一个块的速度基本相同。但是如果表太大而无法缓存,则场景2变得缓慢 - 实际上随着表的增长而变慢和变慢。这是因为I / O. GUID,UUID,MD5和其他哈希因这种减速而臭名昭着。

    另一个问题:事务完整性要求每个事务都会产生一些其他I / O.您的100K是否有100K的交易? 1笔交易?最好是按每个事务100到1000行的组进行批处理。

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