最近有一个产品尝试采用 UUID 代替默认的 int 主键。
由于没有在大规模的生产环境中这样用过,虽然搜索了关于 MySQL UUID 主键的优劣势文章,但毕竟案例还是太少,很多还停留在性能测试阶段。
论坛中是否有朋友在生产环境中采用过 ActiveRecord + MySQL UUID 主键的方案,有没有什么特别的坑?
还没在生产环境试过。不过看网上资料,主键的字段类型设置引起不同的性能变化 postgresql 的 uuid 比 text 省空间 http://simononsoftware.com/how-to-store-uuids-in-postgresql/ SO 上关于 mysql 的两篇文章 http://stackoverflow.com/questions/412341/how-should-i-store-guid-in-mysql-tables http://stackoverflow.com/questions/2365132/uuid-performance-in-mysql/2365176
我的理解,UUID 的优势就是天然适应高并发的环境下使用。如果 id 顺序递增,每创建一条记录都需要对表加一次锁,这在高并发环境下是很大的开销,有时候甚至是不能容忍的。
没有这样用过,不过从 innodb 存储特性看,这种做法非常不可取,如果数据量很大,可能导致严重的性能问题,主要原因有:
新浪微博的主键采用的是自己设计的 UUID 算法。 参考 http://www.infoq.com/cn/articles/online-data-migration-experience
我们做过类似的处理,但不是 UUID,是用 redis 产生 id。因为我的程序需要高写入,所以先要生成内存中的缓存对象,然后再用异步程序进行处理。我不用 UUID 是因为会失去了时间顺序的排列,一些地方可以简单的根据 id 排序来得到时间序列。这在后端构造 redis 的 zset 时候有时候有很大的方便。
@kgen 你的问题,让我想起了我们曾经的一个问题。 我们采用 UUID 作为 mysql 数据库的辅助键,而不是主键,主键依然是 Int ID 我们的情况可能不一样,为了说明我们的情况我写了这个帖子, 为支持移动端离线模式 - 数据库采用 UUID 字段
最近遇到一个场景跟楼主的问题有点参考性。我们有很大量的数据要处理,此时如果用数字就可以很方便分区,新数据是大 ID,使用新机器处理,也方便扩容。但是我们现在的数据 identity 是 md5,这样容易分区(比如按照 md5 的第一个字符)但是不好扩容了,因为新数据仍然落在 MD5 这个大的 key 空间中
主键肯定应该是 int 型的,uuid 不符合要求 楼主可以搜索下 flickr 的分布式 ticket server,就是一句 mysql 语句,充当类似 oracle 的 sequence 功能,专门用来生成全局唯一的数字
从我的使用经验上面来说,mysql 的主键还是保持默认 int 比较好,对数据迁移什么的比较友好,如果真需要 uuid,不妨切换到支持更好的 postgres 或者 mongodb 吧。
这帖子还热着啊,uuid 太占地方了!!!!
twitter Instagram flickr 都用的 bigint 并且不用表级别的自动生成 其中 flickr 用的 mysql 的 replace into 来取巧计算 Instagram 是写了个 postgres sql 函数 根据时间戳、服务器、序列 来自动计算 twitter id 构成基本同 instagram 用的是 erlang
twitter 和 Instagram 的 id 结构类似 内含时间戳 并且 序列增加 易按时间和大小排序和分隔,
ruby 里 关于 twitter flake 的实现一堆一堆的
uuid 的问题是:
所以解决办法是,自己生成绝对不会冲突的纯数字递增主键。Instagram 的做法同样适用于 mysql,见 http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram