【问题标题】:What is better in terms of sqlite3 performance: delete unneeded row or set it as not needed?在 sqlite3 性能方面什么更好:删除不需要的行或将其设置为不需要?
【发布时间】:2012-01-16 17:26:43
【问题描述】:

我正在编写一个 iPhone 应用程序,其中用户接收来自不同用户的多条消息。这些消息存储在 sqlite3 数据库中。随着时间的推移,用户可能希望删除从某个用户收到的消息,但可以肯定的是,在删除旧消息后,他将继续收到来自该用户的新消息。

由于检索消息将使用SELECT 语句完成,因此当用户想要删除消息时使用哪种方案更好(就性能而言):

  1. DELETE 所有旧消息正常并继续使用如下语句检索新消息:SELECT Messages FROM TableName WHERE UserID = (?)
  2. INTEGER 类型的表中添加一个字段,并根据DELETE 请求将此字段设置为1,然后使用如下语句检索新消息:SELECT Messages FROM TableName WHERE UserID = (?) AND IsDeleted = 0

还有一件事,如果使用场景1(普通DELETE),这会导致磁盘上的数据库文件出现任何碎片吗?

非常感谢。

【问题讨论】:

    标签: iphone ios database performance sqlite


    【解决方案1】:

    使用场景 1 会好很多,因为 SQL 中的 SELECTDELETE 运行速度相同,而场景 1 将使您的数据库中没有悬空元组(不需要的行)。

    如果您希望在任何删除过程之后执行数据备份,那么方案 2 是必须的,但您必须考虑到您的数据库越来越大,这会导致未来性能下降。

    最后我想补充一点,对数据库执行删除操作不会导致任何碎片问题,因为大多数数据库在其引擎中都有碎片和优化工具。

    【讨论】:

      【解决方案2】:

      如果DELETE 不能正常工作,这将是一个非常糟糕的数据库。在没有相反证据的情况下,我认为您可以正常删除。数据库的全部存在理由是使这些操作高效。

      【讨论】:

      • 感谢您的回答,但这又引发了另一个问题。我注意到一些应用程序在用户删除它们后确实保留了这些消息。您认为他们这样做有自己的原因,而与性能无关吗?
      • 我无法推测我从未见过的应用程序。就此而言,我不知道这些应用程序的作者是否关心性能或可靠性。除非你真的知道他们为什么做出这样的选择,否则你不应该将你的设计基于他们的实现。
      【解决方案3】:

      恕我直言,如果你不使用 DELETE,一段时间后数据库会变得越来越大,从而使每个 SELECT 的效率越来越低。 因此我认为删除不再使用的行更有效。

      【讨论】:

        猜你喜欢
        • 2017-08-08
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-02
        • 1970-01-01
        相关资源
        最近更新 更多