【问题标题】:Using Unique Indices versus Querying the Database使用唯一索引与查询数据库
【发布时间】:2018-02-26 14:49:30
【问题描述】:

我正在 node.js 中开发登录/注册系统。

通常查询数据库,检查给定的用户名是否已经存在,如果不存在,我创建新用户。

我最近有了一个想法,使用 MySQL 数据库中的唯一索引作为用户名。不过我有一些问题。

  • 检查重复项的最有效方法是什么?在数据库中搜索给定的用户名,或者使用唯一索引并从 MySQL 中捕获错误(如果它已经存在)?

当出现重复时,我对 MySQL 吐出错误感到不安全,但也许我只是疯了。

  • 如果我要使用唯一索引,对每个唯一值都使用它是否仍然有效?例如为用户名、电子邮件等设置唯一索引?

【问题讨论】:

  • 您应该使用唯一键。唯一键不容易出现竞争条件。查询 SELECT 重复检查很容易出现竞争条件。

标签: mysql node.js database


【解决方案1】:

检查重复项的最有效方法是什么?在数据库中搜索给定的用户名,或者使用唯一索引并从 MySQL 中捕获错误(如果它已经存在)?

在第一种情况下,您将使用用户名找到用户,然后检查是否找到。因此,在这种情况下,您的数据库会检查此用户名,并且您还会进行一项检查。

现在考虑存在唯一索引的第二种情况。所以你给mysql数据,它会先尝试检查,要么抛出错误,要么将数据放入数据库。这样,您不必检查 usrname 是否已经在数据库中。这也将使您免于竞争条件

如果您担心 mysql 抛出错误,请不要担心。 mysql 将抛出一个完整性错误,您可以捕获并发送适当的响应,例如用户名已经存在

【讨论】:

  • 有道理。非常感谢!我不知道比赛条件问题,所以知道它绝对是件好事。
【解决方案2】:

最好使用唯一索引(在数据库引擎中进行验证),因为这样可以避免线程竞争并确保数据库完整性。通过 select 进行验证是不安全的,不推荐这样做。

话虽如此,我建议在插入之前使用 select 进行检查,以在尝试插入之前通知用户“用户名已采用”。

使用唯一索引的另一个好理由是性能。根据表的大小,它可能会更快。

【讨论】:

  • 作者:“我建议在插入前先检查一下”你是指查询数据库吗?
  • 是的。这样可以避免在应用中引发异常。
  • 但是我想使用唯一索引的主要原因是避免查询数据库?
猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 2021-02-06
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多