首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >常见的数据库主键选取方式

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

原创
作者头像
用户7705674
修改2021-10-08 15:06:39
修改2021-10-08 15:06:39
1.6K00
代码可运行
举报
文章被收录于专栏:css小迷妹css小迷妹
运行总次数:0
代码可运行

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
代码运行次数:0
运行
复制
    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
代码运行次数:0
运行
复制
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]);  
    }  
}  

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档