Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 就sqlite3性能而言,什么更好:删除不需要的行或将其设置为不需要?_Iphone_Ios_Database_Performance_Sqlite - Fatal编程技术网

Iphone 就sqlite3性能而言,什么更好:删除不需要的行或将其设置为不需要?

Iphone 就sqlite3性能而言,什么更好:删除不需要的行或将其设置为不需要?,iphone,ios,database,performance,sqlite,Iphone,Ios,Database,Performance,Sqlite,我正在编写一个iPhone应用程序,用户从不同的用户那里收到多条消息。这些消息存储在sqlite3数据库中。随着时间的推移,用户可能希望删除来自某个用户的已接收消息,但可以肯定的是,在删除旧消息后,他将继续接收来自该用户的新消息 由于检索消息将使用SELECT语句完成,因此当用户希望删除消息时(就性能而言),哪个场景更适合使用: 正常删除所有旧消息,并使用如下语句继续检索新消息:从TableName中选择消息,其中UserID=(?) 向类型为INTEGER的表中添加一个字段,并在DELETE请

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

由于检索消息将使用
SELECT
语句完成,因此当用户希望删除消息时(就性能而言),哪个场景更适合使用:

  • 正常删除所有旧消息,并使用如下语句继续检索新消息:
    从TableName中选择消息,其中UserID=(?)
  • 向类型为
    INTEGER
    的表中添加一个字段,并在
    DELETE
    请求时将该字段设置为1,然后使用如下语句检索新消息:
    selectmessagesfromtablename,其中UserID=(?)和IsDeleted=0
  • 还有一件事,如果使用场景1(正常
    删除
    ),这会导致磁盘上的数据库文件出现碎片吗


    非常感谢。

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

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

    使用场景1要好得多,因为SQL中的
    SELECT
    DELETE
    都以相同的速度运行,场景1将允许您的数据库中没有悬空元组(不需要的行)

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


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

    非常感谢您的回答,但这又提出了另一个问题。我注意到有些应用程序在用户删除消息后会保留这些消息。你认为他们有自己的原因吗?这与性能无关?我不能猜测我从未见过的应用程序。就这点而言,我不知道这些应用程序的作者是否关心性能或可靠性。你不应该把你的设计建立在他们的实现之上,除非你真的知道他们为什么做出这样的选择。