我有一个问题,希望了解你的意见。
我的模型中id是主键,uuid是次要键。需要注意的是,所有的外部调用,也就是通过API调用,我都使用uuid来识别记录,所以我想知道,使用标准的版本4或版本6(有序)更有效率呢?因为我想象一下,尽管uuid列已经被索引,但是通过使用uuid作为标识符进行API请求时,数据库仍然需要在索引记录中查找它,如果是"有序"(v6),数据库是否可以更容易地找到这条记录?
数据库:MySQL/MariaDB
我有一个问题,希望了解你的意见。
我的模型中id是主键,uuid是次要键。需要注意的是,所有的外部调用,也就是通过API调用,我都使用uuid来识别记录,所以我想知道,使用标准的版本4或版本6(有序)更有效率呢?因为我想象一下,尽管uuid列已经被索引,但是通过使用uuid作为标识符进行API请求时,数据库仍然需要在索引记录中查找它,如果是"有序"(v6),数据库是否可以更容易地找到这条记录?
数据库:MySQL/MariaDB
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树,情况都是一样的。如果您以随机顺序插入,您更有可能导致碎片化和页面分裂。如果您以递增顺序插入,则会更紧凑。