[英]Dealing with large amount of data in php/mysql
所以我有类似拍卖的东西,对于每笔交易或拍卖,我必须生成随机标识符代码并分配给用户。 因此,我想出了类似的方法用于数据库存储{1:XKF3325A|ADSTD2351;7:ZARASR23;12:3290OASJX}
-所以我有一个用户ID:随机码,有些用户可以用|分隔多个随机码。
我的问题是我应该为数据库使用哪种存储类型? 我为用户生成的代码可能超过2k至3k。
也许您问错了问题。 您根本不应该使用这种大小的标识符。 答案是通过使用更好的标识符生成算法来处理较小的标识符。 您的表索引将感谢您。
因此,您应该问的问题是: 如何创建简短但唯一的标识符? 答案如下:
您应该使用加密安全的哈希算法(例如SHA-1 )来生成您的标识符,或者仅使用UUID实现来执行此操作。 PHP具有一个称为uniqid的UUID实现(可能必须在其中编译),因此实际上不需要自己动手。 两种方法给您的ID都比您所使用的ID短,并且都可以在巨大的样本量中“保证”唯一性(并且比您的算法更有效)。 当我说的更短时,我所说的最多是16-64个字节之间的任何位置(SHA-1会生成40个字节的哈希)。
如果您使用SHA-1哈希路由,则方法将是对一些随机(但对用户唯一的输入)进行哈希,例如sha1(timestamp+username+itemname+randomseed)
。 您还可以在此处使用uniqid
(请参见PHP文档中的函数注释)并执行: sha1(uniqid())
。 确保阅读有关uniqid()
的注释,以了解有关每秒生成多个ID的警告。
那如果他们超过3k呢? MySQL可以处理很多事情,不用担心。 只需使用两个表,例如:
Users
- id
- other info..
Identifiers
- random_str
- foreign key to user
然后,您可以获取ID的标识符,获取标识符所属的用户,等等。
首先-有关一些好主意,请参阅Loren Segal的答案。
第二-为什么要使用任何随机数来确保唯一性? 随机值不能保证唯一性-即使它们可以使您不太可能发生碰撞。
在大多数情况下,关系数据库可以毫无问题地解决您的问题。 索引和组合键旨在有效解决此类问题。
如果您需要一个值来唯一地标识事物,请查看Loren提到的独特知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.