【发布时间】:2019-09-20 07:35:21
【问题描述】:
我正在寻找最快/最有效的方法来搜索给定用户名是否可以从一组数千万个用户名中获得。目前我正在使用一个普通的 MySQL SELECT 查询,它运行每个按键,但我对性能不满意。我正在使用索引、分区等,我知道 MySQL 可以优化得非常快,但我也知道有更好的解决方案。
那么什么是最快的用户名搜索:
- Redis EXISTS 命令
- 弹性搜索
- 别的东西
例如:Gmail 如何在注册时搜索数十亿个电子邮件地址。脸书是如何做到的?我假设他们不只是运行 SQL 查询。
我正在为 PHP 应用寻找实用的解决方案。
现在我只使用一个非常基本的选择:
SELECT username FROM users WHERE username = $username LIMIT 1
用户名列上有唯一索引
【问题讨论】:
-
对唯一索引的 SQL 查询有什么问题?如果操作正确,它应该是 O(logN)。
-
@Dharman 根据所采用的索引方法,它甚至可能比这更少。
-
你为什么要检查每一次按键?
-
如果您的查询需要 150 毫秒来运行您的表没有正确索引,您的服务器没有正确调整,或者您的硬件严重不足以完成手头的任务。我拥有拥有数十亿条记录的生产系统,并且测试
UNIQUE密钥的存在时间几乎为零。某些数据库(如 Postgres)为您的数据提供多种索引方法,您可以选择在您的用例中表现最佳的一种。 -
@tomschmidt 您使用的是哪种查询?存在查询应该比普通选择花费更少的时间;它可以在第一场比赛停止,而不是继续收集所有比赛。另外,根据我对php的有限了解;如果您正在检查每个按键,那么您实际上并没有使用 php。