数据库主键为何要用递增的序列?UUID为何不适合作主键?

数据库主键为何要用递增的序列?

顺序的ID占用的空间比随机ID占用的空间小。
缘由是数据库主键和索引索引使用B+树的数据结构进行存储,顺序ID数据存储在最后一个节点的最后的位置,前面的节点数据都是满的。随机ID存储时可能会出现节点分裂,致使节点多了,可是每一个节点的数据量少了,存储到文件系统中时,不管节点中数据是否是满的都会占用一页的空间。因此所致使空间占用较大。java

做为主键的要求

  1. 顺序
  2. 惟一
  3. 能短则短,减小空间占用

自增的ID能够知足大部分业务场景,可是在一些特殊场景中并不合适,只举部分例子mysql

  1. 分布式系统中
  2. 分库分表的数据库设计
  3. 存在一些安全问题,对于一些敏感信息容易被推测。

UUID为何不适合作主键?

UUID值由本机Mac地址和时间戳等因素决定,UUID出现重复几率极几乎能够忽略不计。算法

若是需求是只保证惟一性,那么UUID也是可使用的,可是按照上面的分布式id的要求, UUID实际上是不能作成分布式id的,缘由以下:sql

  1. 首先分布式id通常都会做为主键,可是mysql官方推荐主键要尽可能越短越好,UUID每个都很长,因此不是很推荐
  2. 既然分布式id是主键,而后主键是包含索引的,而后mysql的索引是经过b+树来实现的,每一次新的UUID数据的插入,为了查询的优化,都会对索引底层的b+树进行修改,由于UUID数据是无序的,因此每一次UUID数据的插入都会对主键地城的b+树进行很大的修改,这一点很很差
  3. 信息不安全:基于MAC地址生成UUID的算法可能会形成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制做者位置。

Java中的UUID

package com.one.util;
import java.util.UUID;
public class Test {
    public static void main(String[] args) {
        String uuid= UUID.randomUUID().toString().replace("-", "").toLowerCase();
        System.out.println("UUID的值是:"+uuid);
    }
}
相关文章
相关标签/搜索