什么是更好的sqlite3性能:删除不需要的行或将其设置为不需要?

时间:2012-01-16 17:26:43

标签: iphone ios database performance sqlite

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

由于检索消息将使用SELECT语句完成,当用户想要删除消息时(在性能方面),最好使用哪种方案:

  1. DELETE所有旧邮件通常会使用以下语句继续检索新邮件:SELECT Messages FROM TableName WHERE UserID = (?)
  2. 将字段添加到INTEGER类型的表中,并在DELETE请求时将此字段设置为1,然后使用如下语句检索新消息:SELECT Messages FROM TableName WHERE UserID = (?) AND IsDeleted = 0
  3. 还有一件事,如果使用方案1(正常DELETE),这会导致磁盘上数据库文件的任何碎片吗?

    非常感谢提前。

3 个答案:

答案 0 :(得分:1)

如果DELETE效果不佳,那将是一个非常糟糕的数据库。如果没有相反的证据,我认为你可以正常删除。数据库的整个存在理由是使这些操作高效。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用方案1要好得多,因为SQL中的SELECTDELETE都以相同的速度运行,而方案1将授予您数据库中没有悬空元组(不需要的行)的权限。

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

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