在MySQL中使用自动增量PK的一个主要原因是它保证所有插入到聚簇PK索引中的插入都是有序的,因此很快。我明白了。
但二级指数怎么样?假设我的表有一个二级索引。插入对于PK聚簇索引是有序的,但是对于辅助索引B + Tree是无序的。
所以插入仍然不会很慢因为MySQL需要不断重新安排二级索引B + Tree,因为插入进来了吗?
我只是想知道在这里使用自动增量是否真的在插入性能方面为我买了任何东西。非常感谢这里的一些澄清。
答案 0 :(得分:1)
主键将被群集,这意味着它直接指向磁盘上的数据。必须重新排列数据意味着必须移动完整记录。对于二级索引,它实际上只是指向磁盘上位置的一堆指针。二级索引与记录的排序无关,因此必须在二级索引中移动指针就是移动指针。这比移动完整记录要快得多。
答案 1 :(得分:0)
只有拥有只写(或至少是仅更新)表时,您的基本假设才有效。如果要删除记录,新记录的PK将按顺序(物理)插入。
索引插入的效率几乎总是次要考虑因素并且弄乱它是一种过早的优化反模式。您是否考虑过基数,关键字段长度,缓存大小等通常更为重要的问题?
使用自动增量代理PK首先通常是次优的 - 通常有一个更有用的唯一键,其实际值以更有意义的方式聚类。 (你只能用innodb表集群 - 你意识到了,对吧?)
“群集”表示索引本质上 表。因此,插入代理键时有一个好处,因为所有内容都会添加到表的末尾,因为下一个索引值总是高于之前的任何值(如您所知)。
除非您填写已删除记录创建的漏洞。这可能是间接发生的,但可能是一个开销问题,因为必须重新定位整个记录,这显然比仅仅移动索引键值和指针更多的工作。
对于单个记录的查询而言,群集记录不会为记录范围(例如订单,客户,用户的项目)提供很多好处。如果您可以为单个记录提取多个(或几百个)记录例如,相同的用户值得集群。对于单个用户而言,连续记录插入的可能性要小得多(在大多数情况下),因此按时间顺序进行聚类并没有多大帮助。但是您的要求可能会有所不同。
你没有指定innodb所以我主要回答了myisam(默认),其中只有一个自动增量或按时间顺序的索引会模拟聚类 - 没有明确的选项。