1、自动增长字段: 自动增长型字段允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。这是我们设置主键的首选:
- innodb 中的主键是聚簇索引,会把相邻主键的数据放在相邻的物理存储位置上。如果主键不是自增,而是随机的,那么频繁的插入会使 innodb 频繁地移动磁盘块;
- 在innodb中,别的索引还都要包含主键的值,因此建立索引时占用空间小;
- 利用数字,更容易比较排序。
缺点:
- 当我们需要在多个数据库间进行数据的复制时,自动增长型字段可能造成数据合并时的主键冲突。(可以不同的分表分别从不同的起始主键开始自增,比如分表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]);
}
}
}