常见的数据库主键选取方式

2021-10-08 15:06:39 浏览数 (1)

1、自动增长字段:   自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。这是我们设置主键的首选:

  1. innodb 中的主键是聚簇索引,会把相邻主键的数据放在相邻的物理存储位置上。如果主键不是自增,而是随机的,那么频繁的插入会使 innodb 频繁地移动磁盘块;
  2. 在innodb中,别的索引还都要包含主键的值,因此建立索引时占用空间小;
  3. 利用数字,更容易比较排序。

缺点:

  1. 当我们需要在多个数据库间进行数据的复制时,自动增长型字段可能造成数据合并时的主键冲突。(可以不同的分表分别从不同的起始主键开始自增,比如分表1从1自增,分表2从1000 000自增,在分布式数据中也可以这么处理)

2、使用UniqueIdentifier   比如使用UUID(全局唯一标识符)来作为主键,UUID算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成UUID。从理论上讲,如果一台机器每秒产生10000000个UUID,则可以保证(概率意义上)3240年不重复。   在mysql中有函数生成uuid:SELECT UUID();一般用CHAR(36)类型来存储uuid。本身 UUID 是16字节的,即每个字节byte对应8位二进制数bit,每个16进制对应4位bit。但是我们在MySQL中存储时,是将生成的UUID转化为字符串,字符串的每一位是一个char(mysql中char(1)可以存1个字节),所以有些说UUID是32字节也没有错。同时 MySQL 生成的 UUID 有四个中划线,所以在 utf8 字符集里,长度为 36 字节,即char(36)。

代码语言:javascript复制
    UUID uuid = UUID.randomUUID();

  UUID: 由4个连字号(-)将32个字节长(128位)的字符串分隔后生成的字符串,总共36个字节长。比如:550e8400-e29b-41d4-a716-446655440000 (8-4-4-4-12,32个16进制数对应的字符)   GUID:微软的UUID实现标准,目前应用最为广泛,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)   优点:通过程序直接生成GUID填充主键,不用考虑是否会出现重复。   缺点: UUID 的值有32个字节,与其它那些诸如 4 字节的整数相比,存储空间增大;索引时间较慢。

代码语言:javascript复制
import java.util.UUID;  

public class UUIDUtils  
{  
/** 
 * 获得一个UUID 
 * @return String UUID 
 */  
public static String getUUID()  
{  
    return UUID.randomUUID().toString().replaceAll("-", "");  
}  

/** 
 * 获得指定数目的UUID 
 * @param number需要获得的UUID数量 
 * @return String[] UUID数组 
 */  
public static String[] getUUID(int number)  
{  
    if (number < 1)  
    {  
        return null;  
    }  
    String[] ss = new String[number];  
    for (int i = 0; i < number; i  )  
    {  
        ss[i] = getUUID();  
    }  
    return ss;  
}  

public static void main(String[] args)  
{  
    System.out.println("::"   UUIDUtils.getUUID());  
    String[] ss = getUUID(10);  
    for (int i = 0; i < ss.length; i  )  
    {  
        System.out.println(ss[i]);  
    }  
}  

}

0 人点赞