MySQL:已经出来了

在MySQL中使用自动增量PK的一个主要原因是它确保所有插入到聚集PK索引中的插入都是有序的,因此速度很快。 我明白那个。

但是二级索引呢? 假设我的表有一个二级索引。 插入将按照PK聚簇索引的顺序进行,但是与二级索引B +树无关。

所以插入仍然不会很慢,因为MySQL需要不断重新安排二级索引B +树作为插入进来?

我只是想知道,如果在这里使用自动增量,真的是在插入性能方面向我购买任何东西。 在此将非常感谢一些澄清。


主键将被聚集,这意味着它直接指向磁盘上的数据。 必须重新排列数据意味着完整记录必须移动。 对于二级索引,它实际上只是一堆指向磁盘位置的指针。 二级索引与记录的排序无关,所以不得不在二级索引中移动指针就是移动指针。 这比移动完整记录要快得多。


如果您只有一个只写(或至少只更新)表,您的基本假设是正确的。 如果您正在删除记录,新记录的PK将以非顺序​​(物理)插入。

索引插入的效率几乎总是次要的考虑因素,并且与它相混淆是一个不成熟的优化反模式。 您是否考虑过基数,关键字段长度,缓存大小等通常更重要的问题?

使用自动增量代理PK通常是次优的 - 通常有一个更有用的独特密钥,其实际值以更有意义的方式聚集。 (你只能用innodb表进行聚类 - 你意识到了,对吧?)


“集群”意味着指数本质上就是表格。 所以当插入代理键时它有一个好处,因为所有东西都被添加到表的末尾,因为下一个索引值总是高于以前的值(正如你已经知道的那样)。

除非你填充由删除的记录创建的孔。 这可能会间接发生,但可能是一个开销问题,因为整个记录必须重新定位,这显然比仅移动索引键值和指针更重要。

对于单个记录的查询,集群记录不会为记录的范围提供很多好处(例如,订单,客户,用户的项目)。如果您可以为同一用户提取几个(或几百个)记录,例如,这是值得群集的,对于单个用户(在大多数情况下),连续插入记录的可能性要小得多,所以按照时间顺序排列并没有多大帮助,但是您的要求可能会有所不同。


您没有指定innodb,所以我主要回答myisam(缺省情况),其中只有自动增量或年代索引可以模拟群集 - 没有明确的选项。

链接地址: http://www.djcxy.com/p/90377.html

上一篇: MySQL: is out

下一篇: platform C# implementation of Lua