我正在寻找最快/最有效的方法来搜索一个给定的用户名是否可以从一组数千万的用户名中获得。目前,我使用的是一个正常的MySQL选择查询,它运行每个按键,但我对性能不满意。我正在使用索引、分区等,我知道MySQL可以被优化得非常快,但我也知道有更好的解决方案。
那么,最快的用户名搜索是什么:
例: Gmail在注册时如何跨数十亿个电子邮件地址进行搜索。Facebook是怎么做到的?我想他们不只是运行SQL查询。
我正在为PHP应用程序寻找一个实用的解决方案。
现在,我只是使用一个非常基本的选择:
SELECT username FROM users WHERE username = $username LIMIT 1“用户名”列上有唯一的索引。
发布于 2019-05-02 20:19:15
我同意你应该试着把它都放在RAM中(例如Redis)。
但是,如果您不想一路走下去,我将执行以下操作:将列表存储在某个缓慢的地方(例如,S3或SQL数据库)。接下来,从这个列表中创建一个Bloom过滤器(维基百科上有一些内容,您可以使用一个漂亮的Redis模块- https://oss.redislabs.com/redisbloom)。
现在,BF告诉你永远不会给你一个假否定,所以你可以有效地检查它是否有一个用户名是可用的。然而,有时BF会将用户名报告为不可用(假阳性),并决定是否可以接受。
发布于 2019-05-01 19:08:16
将列表加载到关联数组中。测试钥匙的存在。好了。“数千万”这几天不是很多数据。它可以放进内存。
如果您内存不足,并且不介意出现错误的可能性极小,您可以使用SHA2-256散列代替全部值。这些只有40个字节的十六进制编码,20个字节的原始形式。检查哈希键是否已被索引是非常简单的,在许多情况下甚至是O(1)时间。
记住,只有在处理超过每秒1000个查询的峰值负载时,这才是相关的。不要过早地优化这一点。大多数数据库基本上可以在零时间内进行用户名测试,这并不难,每秒进行一千次测试也不会破坏服务器。
如果您确实存在可测量的性能问题,那么您可以始终探索索引选项。MySQL支持不同的索引类型:BTREE或HASH。它们的表现不同。
发布于 2019-05-30 14:29:56
您的例子提到了使用高端系统的公司。显然,没有任何系统能够做到这一点,原因如下:
让我们假设一家庞大的公司如何在数十亿美元中使用任何用户名:
有一个服务,可能是用C编写的,甚至不是C++。
它部署在Unix或Linux集群上。
还有另一个服务充当第一个服务的健康检查器,它每隔一次检查一个标准用户名和密码。
服务在内存中加载所有数据(通常是用户名和密码)。
当该数据在其源上发生更改时,将调用它来采用更改,这将从数据源触发。
当需要对数据进行调用时(我们的情况下),对健康检查器的两个副本(为了避免服务死掉的延迟)有两个(至少)异步调用,即主服务是活动的。
当任何健康检查器回复ok时,对主服务(检查器)的调用就会发生,并验证或不验证请求的用户名和/或密码。
然后,根据答复,呼叫者继续进行。
总之,任何尽可能接近这一点的解决方案都会很快奏效。像上面提到的redis这样的内存'db‘有点接近--考虑到这些差异,意味着足够接近。如果一家庞大的公司获得了10的业绩,而一个简单的网站使用类似的做法,按照相同的原则并根据每个公司的规模调整成本,那么我认为这是一个成功的选择。
https://stackoverflow.com/questions/55941277
复制相似问题