uuid v4和v6(有序),哪一个对MySQL更有效?

3

我有一个问题,希望了解你的意见。

我的模型中id是主键,uuid是次要键。需要注意的是,所有的外部调用,也就是通过API调用,我都使用uuid来识别记录,所以我想知道,使用标准的版本4或版本6(有序)更有效率呢?因为我想象一下,尽管uuid列已经被索引,但是通过使用uuid作为标识符进行API请求时,数据库仍然需要在索引记录中查找它,如果是"有序"(v6),数据库是否可以更容易地找到这条记录?

数据库:MySQL/MariaDB


1
相反,当进行索引时,有序非常重要。@tadman - Basil Bourque
1个回答

4

Michael Coburn发表了一篇关于此问题的杰出博客:https://www.percona.com/blog/2015/04/03/illustrating-primary-key-models-in-innodb-and-their-impact-on-disk-usage/

这篇博客是在2015年编写的,但其思想仍然适用。

他展示了使用无序UUID以“随机”顺序插入记录会导致大量碎片化,因为随机顺序的插入会导致许多页面分裂。而当记录按插入顺序存储时,因为主键单调递增(例如自动递增整数或有序UUID),则会减少页面分裂,表最终存储得更紧凑。

更紧凑的表平均每页可存储更多的记录,因此分配给缓存的内存可以容纳更大比例的表数据,使其更有效率。


那篇博客涉及到主键,而你所问的是关于次要键的。

对于任何存储在页面中的B树,情况都是一样的。如果您以随机顺序插入,您更有可能导致碎片化和页面分裂。如果您以递增顺序插入,则会更紧凑。


1
回答不错。但是您没有直接回答问题的要点。我建议添加一句话提到:(a) 版本6 UUID是专门为解决旧版本UUID索引效率低下而发明的解决方案。请参见此处讨论。(b) 版本6、7和8 UUID目前正在提议中,但尚未获得IETF的批准。 - Basil Bourque
我会让读者们去阅读你的评论。 - Bill Karwin
@BasilBourque,关于PHP包的讨论的第一个链接已将UUID 6-8从非标准移至其稳定版本,新链接。他们指出rfc4122仍然是草案,但也指出格式可能不会改变,因此他们现在实施了它。 - luckydonald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接