Iphone 就sqlite3性能而言,什么更好:删除不需要的行或将其设置为不需要?
我正在编写一个iPhone应用程序,用户从不同的用户那里收到多条消息。这些消息存储在sqlite3数据库中。随着时间的推移,用户可能希望删除来自某个用户的已接收消息,但可以肯定的是,在删除旧消息后,他将继续接收来自该用户的新消息 由于检索消息将使用Iphone 就sqlite3性能而言,什么更好:删除不需要的行或将其设置为不需要?,iphone,ios,database,performance,sqlite,Iphone,Ios,Database,Performance,Sqlite,我正在编写一个iPhone应用程序,用户从不同的用户那里收到多条消息。这些消息存储在sqlite3数据库中。随着时间的推移,用户可能希望删除来自某个用户的已接收消息,但可以肯定的是,在删除旧消息后,他将继续接收来自该用户的新消息 由于检索消息将使用SELECT语句完成,因此当用户希望删除消息时(就性能而言),哪个场景更适合使用: 正常删除所有旧消息,并使用如下语句继续检索新消息:从TableName中选择消息,其中UserID=(?) 向类型为INTEGER的表中添加一个字段,并在DELETE请
SELECT
语句完成,因此当用户希望删除消息时(就性能而言),哪个场景更适合使用:
正常删除所有旧消息,并使用如下语句继续检索新消息:从TableName中选择消息,其中UserID=(?)
INTEGER
的表中添加一个字段,并在DELETE
请求时将该字段设置为1,然后使用如下语句检索新消息:selectmessagesfromtablename,其中UserID=(?)和IsDeleted=0
删除
),这会导致磁盘上的数据库文件出现碎片吗
非常感谢。如果
DELETE
无法正常工作,那么这将是一个非常糟糕的数据库。在没有相反证据的情况下,我认为你可以正常删除。数据库存在的全部理由是使这些操作高效 IMHO如果不使用DELETE,一段时间后数据库会变得越来越大,从而使每个SELECT的效率越来越低。
因此,我认为删除不再使用的行更有效。使用场景1要好得多,因为SQL中的
SELECT
和DELETE
都以相同的速度运行,场景1将允许您的数据库中没有悬空元组(不需要的行)
如果您希望在任何删除过程之后执行数据备份,那么场景2是必须的,但您必须考虑到数据库的不断增长,这会导致将来的性能降低
最后,我想补充一点,在数据库上执行删除操作不会导致任何碎片问题,因为大多数数据库的引擎中都有碎片和优化工具。非常感谢您的回答,但这又提出了另一个问题。我注意到有些应用程序在用户删除消息后会保留这些消息。你认为他们有自己的原因吗?这与性能无关?我不能猜测我从未见过的应用程序。就这点而言,我不知道这些应用程序的作者是否关心性能或可靠性。你不应该把你的设计建立在他们的实现之上,除非你真的知道他们为什么做出这样的选择。