我有三个表:其中一个是唯一的“昵称”字段的用户表,还有四百多个名称,三十万多个形容词以及大量可能的组合。
当用户订阅时,可以通过将随机名称与随机形容词相结合来生成一种独特、随机且有趣的昵称。用户单击按钮,Voilà!一个令人兴奋的身份得以诞生。
我通过运行两个查询来选择随机名称和形容词:
如果他是的话,可怜的家伙,我会再次遍历直到找到一个未被占用的东西。
但是,正如你们可能已经发现的那样,用户基数的增长也意味着更长的循环和我的脆弱的EC2 Tier 1 Matchbox更多的汗水。所以我想出了一个绝妙的解决方案:如果我预先生成所有可能的组合并将它们塞进一个巨大的表格中会怎样? 这将允许简单的拔插操作,而我将在某个匿名海滩上轻松地享受鸡尾酒,或者不会吗?我的谦卑的LAMP实例会在庞大的表格(男性和女性)的壮丽景象面前颤抖而逃吗?有更好的解决方案吗?
当用户订阅时,可以通过将随机名称与随机形容词相结合来生成一种独特、随机且有趣的昵称。用户单击按钮,Voilà!一个令人兴奋的身份得以诞生。
我通过运行两个查询来选择随机名称和形容词:
SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM names/adjectives
并且
SELECT * FROM names/adjectives LIMIT offset, 1
然后我会检查用户是否不幸地生成了一个已经存在的身份标识。
SELECT COUNT(nickname) FROM users WHERE nickname=:generatedNickname
如果他是的话,可怜的家伙,我会再次遍历直到找到一个未被占用的东西。
但是,正如你们可能已经发现的那样,用户基数的增长也意味着更长的循环和我的脆弱的EC2 Tier 1 Matchbox更多的汗水。所以我想出了一个绝妙的解决方案:如果我预先生成所有可能的组合并将它们塞进一个巨大的表格中会怎样? 这将允许简单的拔插操作,而我将在某个匿名海滩上轻松地享受鸡尾酒,或者不会吗?我的谦卑的LAMP实例会在庞大的表格(男性和女性)的壮丽景象面前颤抖而逃吗?有更好的解决方案吗?
OFFSET
不是高效的做法 -- 处理过程需要读取那么多行才能找到你想要的第一行。 - Rick James