UUID 是指Universally Unique Identifier,翻译为中文是 通用唯一识别码 ,UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息。如此一来,每个人都可以创建不与其它人冲突的 UUID,就不需考虑数据库创建时的名称重复问题。
mysql里面内置了UUID的函数:
select UUID();
使用UUID的优点:
1. 能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
2. 保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
使用UUID的缺点:
1 比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。
2 使用UUID后,URL显得冗长,不够友好。
3 没有内置的函数获取最新产生的UUID主键。
4 很难记忆。Join操作性能比int要低。
5 UUID做主键将会添加到表上的其他索引中,因此会降低性能。
使用主键的优点:
1. 数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利;
2. 数字型,占用空间小,易排序,在程序中传递也方便;
3. 能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
4. 保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
5. mysql检索数字类型的速度会更快,主键连续增长IO写入的性能比较好。
使用主键的缺点:
1. 因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其它系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的)。特别是在新系统上线时,新旧系统并行存在,并且是异库异构的数据库的情况下,需要双向同步时,自增主键将是你的噩梦;
2. 在系统集成或交接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重;
3. 若系统也是数字型的,在导入时,为了区分新老数据,可能想在老数据主键前统一加一个字符标识(例如“o”,old)来表示这是老数据,那么自动增长的数字型又面临一个挑战。
4. 如果经常有合并表的操作,就可能会出现主键重复的情况
5. 很难处理分布式存储的数据表。数据量特别大时,会导致查询数据库操作变慢。此时需要进行数据库的水平拆分,划分到不同的数据库中,那么当添加数据时,每个表都会自增长,导致主键冲突。
总结一下 :
其实使用uuid主要就是为了在分布式环境下,实现主键增长时的不冲突,但是它的性能没有主键高,现在的分布式的环境下都是使用mycat等中间件,让mycat来分析每一条sql语句所要加的库,来防治主键的冲突(这里的mycat是单线程的,主要是防止数据的冲突)。
所有在大部分的情况下,都是不推荐去使用uuid作为主键的。