php/mysql中大量数据的处理

php/mysql中大量数据的处理,php,mysql,Php,Mysql,所以我有类似于拍卖的东西,对于每笔交易或拍卖,我必须生成随机识别码并分配给用户。 所以我为db存储想出了类似的东西{1:XKF3325A | ADSTD2351;7:ZARASR23;12:3290OASJX}-所以我有一个用户id:随机码,一些用户可以有几个由|分隔的随机码 我的问题是我应该为我的数据库使用什么类型的存储?我为用户生成的代码可能超过2k-3k。那么,如果它们超过3k呢?MySQL可以处理大量的东西,不用担心。只需使用两个表,如: Users - id - other inf

所以我有类似于拍卖的东西,对于每笔交易或拍卖,我必须生成随机识别码并分配给用户。 所以我为db存储想出了类似的东西{1:XKF3325A | ADSTD2351;7:ZARASR23;12:3290OASJX}-所以我有一个用户id:随机码,一些用户可以有几个由|分隔的随机码


我的问题是我应该为我的数据库使用什么类型的存储?我为用户生成的代码可能超过2k-3k。

那么,如果它们超过3k呢?MySQL可以处理大量的东西,不用担心。只需使用两个表,如:

Users
 - id
 - other info..

Identifiers
 - random_str
 - foreign key to user

然后,您可以获取id的标识符,获取标识符所属的用户,等等,如果它们超过3k怎么办?MySQL可以处理大量的东西,不用担心。只需使用两个表,如:

Users
 - id
 - other info..

Identifiers
 - random_str
 - foreign key to user

然后您可以获取id的标识符,获取标识符所属的用户,等等

也许您问错了问题。您不应该处理这种大小的标识符。答案是通过使用更好的标识符生成算法来处理更小的标识符。您的表索引将非常感谢

因此,您应该问的问题是:如何创建简短但唯一的标识符?答案如下:

您应该使用加密安全的哈希算法(例如)来生成标识符,或者只使用UUID实现来实现。PHP有一个名为UUID的实现(可能必须在中编译),所以实际上不需要自己编译。这两种方法都为您提供了一个比您正在使用的ID短得多的ID,并且都可以在巨大的样本量中“保证”唯一性(并且比您的算法更有效)。当我说shorter时,我指的是最多16-64字节(SHA-1生成40字节的散列)


如果您使用SHA-1散列路径,方法将是散列一些随机的(但对用户输入是唯一的),如
sha1(timestamp+username+itemname+randomseed)
。您还可以在此处使用
uniqid
(请参阅PHP文档中有关函数的注释)并执行:
sha1(uniqid())
。请务必阅读有关uniqid()的说明,以了解有关每秒生成多个ID的注意事项。

也许您问错了问题。您不应该处理这种大小的标识符。答案是通过使用更好的标识符生成算法来处理更小的标识符。您的表索引将非常感谢

因此,您应该问的问题是:如何创建简短但唯一的标识符?答案如下:

您应该使用加密安全的哈希算法(例如)来生成标识符,或者只使用UUID实现来实现。PHP有一个名为UUID的实现(可能必须在中编译),所以实际上不需要自己编译。这两种方法都为您提供了一个比您正在使用的ID短得多的ID,并且都可以在巨大的样本量中“保证”唯一性(并且比您的算法更有效)。当我说shorter时,我指的是最多16-64字节(SHA-1生成40字节的散列)


如果您使用SHA-1散列路径,方法将是散列一些随机的(但对用户输入是唯一的),如
sha1(timestamp+username+itemname+randomseed)
。您还可以在此处使用
uniqid
(请参阅PHP文档中有关函数的注释)并执行:
sha1(uniqid())
。请务必阅读有关uniqid()的注释,以了解每秒生成多个ID的注意事项。

首先-请参阅Loren Segal的答案以了解一些好的想法

第二,为什么要使用任何随机的方法来确保唯一性?随机值不能保证唯一性——即使它们会使发生碰撞的可能性非常小

在大多数情况下,关系数据库都可以解决您的问题,而无需任何技巧。为了有效地解决这类问题,设计了索引和组合键


如果你需要一个单一的值来唯一地识别某个东西,那么就看看Loren提到的非流动性的东西。

首先,看看Loren Segal的答案,了解一些好的想法

第二,为什么要使用任何随机的方法来确保唯一性?随机值不能保证唯一性——即使它们会使发生碰撞的可能性非常小

在大多数情况下,关系数据库都可以解决您的问题,而无需任何技巧。为了有效地解决这类问题,设计了索引和组合键


如果您需要一个值来唯一标识某个内容,请查看Loren提到的非流动内容。

在后面的阶段中,我需要为每个用户提供代码,这就是为什么我只使用10个字符的大写和数字。像sha1这样的东西会产生糟糕的字符串供用户读取。如果用户的代码可能是2k到3k,那么它将比用户读取的sha1()散列糟糕得多!在这个问题上还有其他的建议-我真的不认为SHA-1哈希比您提供的示例更糟糕。如果您担心的话,您总是可以执行一些对称转换以便于显示(用“-”分隔每个8个字符),但是“随机字符串”总是看起来像“随机字符串”.Yobo 2k到3k不是针对一个用户的,当然每个用户都会得到它应该得到的记录,例如1-5,这取决于具体情况@Loren Segal,为了重述一下,你们想让我使用40个字符的字符串,并处理它来显示,而不是不需要处理的10个字符的字符串。很抱歉,如果我不明白你的意思,也许我完全弄错了。在以后的阶段,我需要为每个用户提供代码,这就是为什么我只做10个字符的大写和数字。像sha1这样的东西会产生可怕的字符串供用户阅读。如果您的用户代码可能是2k到3k,那么它将是一个整体