【问题标题】:Database Insertion vs. String concatenation数据库插入与字符串连接
【发布时间】:2013-08-04 12:42:01
【问题描述】:

我有一个 SQlite 表,我需要在其中连续插入 6 个项目。并且有 4000 行这样的行。所以需要 4000 * 6 次插入操作。为了减少它,我将这六个项目连接起来并将它们作为一列插入,因此只有 4000 个操作。

但我知道字符串连接操作的复杂性是O(n^2),其中 n 是字符串的编号。当我获取项目时,我需要将字符串分成 6 个部分。相反,任何像插入/查询这样的数据库操作都具有M * O(log(n)) 的复杂性,其中 M 是行数,n 是列,因为它维护B-tree 结构。

那我现在该怎么办?我应该将 6 个项目连接在一起并插入它然后拆分它,还是应该将它们插入 6 列并在 6 次尝试中查询它们?哪个会省时?

【问题讨论】:

  • 我不明白你在问什么。您可以使用一个 sql-insert/update-statement 插入/更新一行的 6 个项目(=列)。您是否有想要通过数据库非规范化解决的性能问题?

标签: android sqlite string-concatenation


【解决方案1】:

你所有的算法复杂度估计都是错误的。

实现字符串连接的最简单的方法是 O(n²)。 当 SQLite 构造一条记录时,它已经知道有多少个字符串以及它们有多大,因此它永远不需要重新分配或移动部分字符串。构建一条记录所需的实际时间是 O(n)。 (这忽略了字符串的大小,但如果我们假设所有字符串的大小相同,这无关紧要。)

即使 SQLite 插入多个字符串,它也会在将记录插入表的 B-tree 之前构造记录。

在 B-tree 的任意位置插入一条记录是 O(log M);如果你只是追加一条记录,那就是 O(1)。


请注意,你的数字 n 和 M 不会变得无限大,而是有界的,所以你只有常数,所以你所有的时间实际上都是 O(1)。 对你来说重要的是 O 符号隐藏的常数因子;找出它们的唯一方法是实际衡量您的运营。

【讨论】:

    【解决方案2】:

    我更喜欢SQLite,因为您可以更轻松地过滤查询和管理数据。

    如果您必须修改或删除字符串连接的一列怎么办? 使用String 会更复杂,因为您必须拆分数据,找到要修改/删除的数据,然后将其重新插入数据库。

    我不明白为什么你必须“在 6 次尝试中查询它们”(你的意思是一个一个地查询吗?):通过一个简单的查询,你可以拥有一个包含所有您需要的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多