我有一个表格,其ID是"真正的主键"的哈希值。如果我错了,请纠正我,但我认为我的插入在这个表中非常慢,因为此键上的聚集索引(插入100 000行需要几分钟)。 当我将密钥更改为非聚簇索引时,我的印象是innoDB仍在秘密地聚集在其上。
是否有一种简单的方法可以避免主键上的mysql集群而无需定义自动增量主键?
答案 0 :(得分:2)
InnoDB 必须拥有PRIMARY KEY
。
PRIMARY KEY
,无论是否AUTO_INCREMENT
。UNIQUE
键,但前提是这些列都不是NULLable
。场景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。