【问题标题】:How to add only unique records to a database in scalable fashion如何以可扩展的方式仅将唯一记录添加到数据库中
【发布时间】:2010-07-28 09:02:07
【问题描述】:

我只想将唯一记录添加到数据库表中。有什么方法可以做到这一点,而不必进行选择以查看当前记录是否已经存在,因为随着表的增长,这将变得非常耗时。我愿意接受所有类型的建议(如果存在)。

同样作为一种可能的替代方案,也许有一些索引选项可以使这些选择更快,或者数据可以以使选择语句执行更快的方式排序。

我正在使用 MySQL 和 Java。

【问题讨论】:

  • 看来答案通常是否定的。所以谢谢,这也有助于了解什么是不可能的。
  • 从您的评论到 Vinko 的回答,我假设您希望避免将数据转换为记录格式?尽管它无助于解决您最初的问题,但如果您在内存中保留 HashSet 以及您最近插入的记录的识别数据,它可能会有所帮助。这允许您跳过选择最近插入的数据,这可能是 90% 的流量,具体取决于您的应用程序行为。如果集合中没有找到数据,则需要执行select才能确定。

标签: java mysql database


【解决方案1】:

最简单的方法是让数据库强制唯一性(索引的唯一键集很可能会很好),这样任何重复都会被拒绝。然后,您的代码需要忽略拒绝消息。

【讨论】:

    【解决方案2】:

    有两种可能。

    1. 假设它不是重复的,因此执行 INSERT 并通过执行 UPDATE 来处理错误。
    2. 假设它是重复的,因此执行 UPDATE 并通过执行 INSERT 来处理错误。

    哪个更好取决于相对概率。

    【讨论】:

      【解决方案3】:

      必须有人进行检查,除非您可以从数据中推断出它之前是否已存储,是否可能取决于数据和用例。

      鉴于无论如何都必须有人进行检查,为什么不让数据库为您检查呢?它将检查其唯一索引(您确实有唯一索引并强制执行,对吗?)如果记录已存在,则返回错误。

      IOW,只要尝试插入并捕获任何产生的错误,如果错误是重复键错误,则跳过记录。

      【讨论】:

      • 我自己表述有误,当然有唯一索引,但记录不是一条记录,而是一组数据,相当于一条记录。但我想我会做选择。
      • 一组数据相当于一条记录和一条记录有什么区别?
      • 等价的数据具有相同的字段,但不是唯一的 id - 所以不是 100% 相同,但从用户的角度来看,它具有等价的数据。
      • 一张表可以有多个唯一索引,并且可以使用多个列构建唯一索引。因此,您可以使用逻辑上使两条记录相等的那些字段创建另一个唯一索引。如上所述,检查必须在某处完成 - 让数据库处理它。
      【解决方案4】:

      您可以将数据加载到 tmp 表中,然后从该表中加载 tmp.id != id 的所有结果,然后截断 tmp。

      如果插入事务不是那么重要,您可以创建一个唯一约束。

      为了更快地访问,只需创建一个私钥,这将为您的表创建一个聚集索引。而且访问时间会非常快。

      【讨论】:

      • 感谢您研究这些想法
      猜你喜欢
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多