检查用户名是否可用于庞大数据集的最快方法是什么?

问题描述 投票:2回答:3

我正在寻找最快/最有效的搜索方式,如果一个给定的用户名可以从一组数千万个用户名中获得。目前我正在使用正常的MySQL SELECT查询,每次按键运行,但我对性能不满意。我正在使用索引,分区等,我知道MySQL可以非常快地进行优化,但我也知道有更好的解决方案。

那么什么是最快的用户名搜索:

  • Redis EXISTS命令
  • Elasticsearch
  • 还有别的

例如:Gmail在注册时如何搜索数十亿个电子邮件地址。 Facebook如何做到这一点?我假设他们不只是运行SQL查询。

我正在寻找一个PHP应用程序的实用解决方案。

现在我只是使用一个非常基本的选择:

SELECT username FROM users WHERE username = $username LIMIT 1

用户名列上有唯一索引

php mysql redis
3个回答
4
投票

我同意你应该尝试将它全部放在RAM中(例如Redis)。

但是如果你不想全力以赴,我会做以下事情:将列表存储在某个地方很慢(例如S3或SQL数据库)。接下来,制作一个Bloom过滤器(在维基百科上有一些内容,并且你可以使用一个漂亮的Redis模块 - https://oss.redislabs.com/redisbloom)。

现在,BF告诉永远不会给你一个假阴性,所以你可以有效地检查它是否有用户名。但是,有时BF会将用户名报告为不可用(误报),并且您已决定是否可以使用该用户名。


0
投票

将列表加载到关联数组中。测试密钥的存在。完成。如今,“数千万”并不是很多数据。它适合RAM。

如果你的记忆力不足并且不介意天文数字很小的假阳性,你可以使用SHA2-256哈希值而不是全值。这些只有40个字节的十六进制编码,原始形式为20个字节。检查哈希键是否已被索引是微不足道的,在许多情况下甚至是O(1)时间。

Remember this is only relevant if you're dealing with peak loads in excess of 1000 queries per second. Don't prematurely optimize this. Most databases can do a username test in basically zero time, it's not even hard, and doing a thousand tests a second is not going to break your server.

如果确实存在可衡量的性能问题,那么您始终可以探索索引选项。 MySQL supports different index typesBTREEHASH。这些表现不同。


0
投票

您的示例提到了使用高端系统的公司。显然没有任何系统可以做到这一点,这就是为什么:

让我们假设一个巨大的公司如何在数十亿之间解决任何用户名:

有一种服务,可能用C语言编写,甚至不是C ++

它部署在Unix或Linux集群中

还有另一项服务充当第一个检查每个例如健康检查器的健康检查器。第二个是标准用户名和密码

该服务将所有数据(通常是用户名和密码)加载到内存中

当数据在其源头发生变化时,会调用它来采用更改,这是从数据源触发的

当需要对数据进行调用时(我们的情况),有两个(最小)异步调用两个健康检查器副本(以避免服务死亡延迟)主服务是活着的

当任何健康检查回复时,发生对(主检查员)主服务的调用,并验证请求的用户名和/或密码。

然后呼叫者根据回复连续。

总结一下,尽可能接近尽可能快的解决方案。像上面提到的redis这样的内存'db'有点接近 - 考虑到差异,有点意味着足够接近。如果一个巨大的公司获得10的表现,并且一个简单的网站使用类似的做法获得8-9的表现,遵循相同的原则,成本调整到每个公司规模,我相信是一个成功的选择。

© www.soinside.com 2019 - 2024. All rights reserved.