JDe*_*age 2 php mysql optimization
所有,
我想在注册期间为服务器端生成用户ID.此id应该是顺序的,以允许聚簇索引.显然,它也必须是独一无二的.
我可以uniqid("")在多大程度上用于此目的?我不是在构建Google,我认为2个用户在同一微秒注册的风险接近于nill  - 但我没有实际经验可以作为自己的基础.SQL将拒绝重复的id,我可以在我的php代码中有一个循环,在碰撞/数据输入失败时继续发送新的注册条目,但如果碰撞很少,这只是一个很好的方法.
或者,我可以添加一个随机的postcript uniqid("",TRUE),但是如果2个用户在相同的微秒内注册,则键不能再是连续的.
解决我难题的最佳实用方法是什么?我是否想过这个?
谢谢,
JDelage
uniqid只不过是一个接口microtime(这就是它生成顺序ID的原因),因此,它可以是可预测的并且可以创建重复.
此id应该是顺序的,以允许聚簇索引.显然,它也必须是独一无二的.[...]我是否过度思考这个?
大多数数据库(包括MySQL)都包含事务安全序列生成器.  MySQL的实现,AUTO_INCREMENT相当原始,但也很有效.auto-inc主键可以确保唯一性,更重要的是,并不奇怪.
也就是说,只需确保表中的id列是主键即可完全防御重复ID.
在数据库理论中,假设没有事件发生在同一时间量子,在你的情况下是微秒.许多数据库概念建立在这个假设之上.
我没有听到uniqid顺序请求生成相同的哈希值.因为,它的种子是微秒,并且很可能你的处理器在一微秒内或多或少地执行机器指令,处理两个请求之间有太多的时间(即使它们在单个CPU中同时运行).
如果您认为可能存在512位散列(32个十六进制字符)的冲突,那么您可以构建自己的摘要函数,该函数利用字母表和标点符号中的更多字符,因为正如我之前所说,我们解决了时间种子问题,所有你应该担心的必须是充分利用种子和降低碰撞概率.
如果你想确定,你可以以互斥的方式提供请求,然后在你提出请求之后,你可以向数据库插入一行(假设用户注册,你将用户记录插入到用户表中)和使用PHP函数,mysql_insert_id()然后您可以继续提供其他请求,以便您可以使用最近插入的记录ID作为种子(对于任何两个连续的请求,它将始终不同).
根据要求对最后一段进行澄清: 
正如我之前所说,根据服务理论,在数据库中没有任何同时发生的事情.总是,其中一个先服务.因此,您可以在数据库中启动事务.假设您正在注册新用户.你会说INSERT INTO users (username, password) VALUES (?, ?).你去了,你已经插入了一个新用户.当这个数据库查询发生时,你应该实现一个互斥锁(mutex),我不知道它是如何在PHP中完成的.如果您实现了互斥锁,则第二个请求将等到第一个请求完成处理.在数据库上插入行后,您将使用$i = mysql_insert_id()检索刚插入的行的ID!当你说$i+1第二个用户的ID时,它将是唯一的.因为第一个用户是让我们说的300,那么第二个用户就是301.
实际上,数据库自动增量ID始终是唯一的.如果您想为用户提供唯一的字符串哈希,这是一个方法.
$i = mysql_insert_id()$d = strrev(md5($i))unique_id的users表的列上UPDATE user SET unique_id='$d' where id=$i.