我正在编写一个 iPhone 应用程序,用户可以在其中接收来自不同用户的多条消息。这些消息存储在 sqlite3 数据库中。随着时间的推移,用户可能希望删除从某个用户收到的消息,但可以肯定的是,在删除旧消息后,他会继续收到来自该用户的新消息。
由于检索消息将使用 SELECT
语句完成,因此当用户想要删除消息时,哪种情况更适合使用(就性能而言):
DELETE
正常删除所有旧消息,然后使用如下语句继续检索新消息:SELECT Messages FROM TableName WHERE UserID = (?)
- 向
INTEGER
类型的表中添加一个字段,并根据DELETE
请求将此字段设置为 1,然后使用如下语句检索新消息:SELECT Messages FROM TableName WHERE UserID = (?) AND IsDeleted = 0
还有一件事,如果使用方案 1(正常 DELETE
),这会导致磁盘上的数据库文件产生任何碎片吗?
非常感谢。
最佳答案
使用方案 1 更好,因为 SQL 中的 SELECT
和 DELETE
以相同的速度运行,并且方案 1 将使您没有悬垂的元组(不需要的行)在你的数据库中。
如果您希望在任何删除过程后执行数据备份,那么方案 2 是必须的,但您必须考虑到数据库规模的增长会导致 future 性能下降。
最后我想补充一点,对数据库执行删除操作不会导致任何碎片问题,因为大多数数据库的引擎中都有碎片和优化工具。
关于iphone - 在 sqlite3 性能方面有什么更好的 : delete unneeded row or set it as not needed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883830/