浏览 5048 次
锁定老帖子 主题:数据库主键策略的一些感想
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-23
1.数据库是使用多台mysql。 2.用mysql 的 replication来分离读写。 3.根据用户ID来分布数据库中的数据。 问题: 1.mysql没有像oracle中的sequence。自制sequence的话怕影响效率。 2.采用mysql中的自增长主键,在分布数据库中会有重复主键问题。键值必须在多个数据库中惟一。 3.在网上查了几个程序生成的主键的方式,似乎都很长最长的要128位,这对与键索引来说会太大。 4.用时间到毫秒在加5位随机数来生成主键,但这也要20位,还是不理想。 查询了公司之前项目的主键生成机制。 发现了原项目中用了Oracle的sequence,并用一procedure把数字sequence压缩成字母大小写在加数字的形式。就是把原来的10进变成64进制,相应的位数就减少了很多。 最后决定用php来写一个压缩数字日期加随机数的程序来做,把主键限定在10以内. 大家有什么好的建义,参考参考。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-23
一般情况下同一系统中32位(8个字符的16进制表示)的主键就很难有重复,更保守一点的就是128位(32个字符的16进制表示)的主键了。
你要使用日期+随机数的表示,yyMMddHHmmss就已经12位了,后面精确到毫秒在加至少3位随机数就18位长了,其实也不短,呵呵。 |
|
返回顶楼 | |
发表时间:2007-08-23
Zmud 写道 一般情况下同一系统中32位(8个字符的16进制表示)的主键就很难有重复,更保守一点的就是128位(32个字符的16进制表示)的主键了。
你要使用日期+随机数的表示,yyMMddHHmmss就已经12位了,后面精确到毫秒在加至少3位随机数就18位长了,其实也不短,呵呵。 20位是太长了。所要压缩到10位。压缩方式就是把10进制改成正64进制,也就是说每一个位上可以有64种状态。日期表示也不定要yyMMddHHmmss的形式,可以用从2008-08-23 24:00:00:000开始到现在毫秒数。故计这么做可以压缩在10位以内,具体还没有编程。 |
|
返回顶楼 | |
发表时间:2007-08-31
索引用整形比用字符串性能好吧。
|
|
返回顶楼 | |
发表时间:2007-10-01
自制sequence做好是不应该有效率问题的,而且有高度数据库平台无关性的优点,不过要确保任何情况的ID的唯一性,如系统崩溃时怎么保证ID的唯一性,这需要一些技巧。
|
|
返回顶楼 | |
发表时间:2007-10-02
字符串可能效率会不够。
可以考虑这样的策略: 类似用户id分配,每个数据库给个编号,每个自增长初始值错开,步长设置超过数据库数量,例如: 1, 11, 21, 31, ... 2, 12, 22, 32, ... |
|
返回顶楼 | |