Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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/7/sqlite/3.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
Performance SQLite中对性能的主键影响_Performance_Sqlite_Primary Key_Indexing - Fatal编程技术网

Performance SQLite中对性能的主键影响

Performance SQLite中对性能的主键影响,performance,sqlite,primary-key,indexing,Performance,Sqlite,Primary Key,Indexing,我有一个sqlite数据库,用于存储有关备份作业的信息。每运行一次,由于向特定表中添加了大约32000个条目,它将增加大约25mb 此表是一个“映射表”,用于将某些信息链接到另一个表中的记录。。。它有一个主键(autoincrement int),我不使用它 sqlite将根据其值为INT列保留1、2、4或8个字节。此表只有3个附加列,也是INT类型 我在数据库中添加了查询中用作过滤器(WHERE)的列的索引 在存在索引等情况下,以及在所描述的情况下,主键在性能方面是否有任何有用的好处 注意:性

我有一个sqlite数据库,用于存储有关备份作业的信息。每运行一次,由于向特定表中添加了大约32000个条目,它将增加大约25mb

此表是一个“映射表”,用于将某些信息链接到另一个表中的记录。。。它有一个主键(autoincrement int),我不使用它

sqlite将根据其值为INT列保留1、2、4或8个字节。此表只有3个附加列,也是INT类型

我在数据库中添加了查询中用作过滤器(WHERE)的列的索引

在存在索引等情况下,以及在所描述的情况下,主键在性能方面是否有任何有用的好处


注意:性能对于这个项目非常非常重要——但如果32000条输入作业上保存10ms意味着额外的10MB数据,则性能就不重要了

主键索引用于查找给定主键的行。它还用于确保主键值是唯一的

如果使用其他列搜索数据,则不会使用主键索引,因此不会产生性能优势。不过,它的存在也不应该对性能产生负面影响


不必要的索引会浪费磁盘空间,并使INSERT和UPDATE语句的执行速度变慢。它应该不会对查询性能产生负面影响。

如果您真的不使用此id,您为什么不删除此列+主键?使未使用的主键id列保持活动状态的唯一原因是可以创建与另一个表的主-详细信息关系


另一种可能是保留列,但删除主键。这意味着应用程序必须注意为每个insert语句提供唯一的id。在每次批处理操作之前和之后,必须检查此列是否仍然唯一。这在MySQL和Oracle中不起作用,因为存在多并发问题,但在sqlite中起作用。

我基本上同意这一点。重要的想法是将数据库保存在内存中,如果索引太大,则可能会有问题。@未知:对于常规磁盘备份的内存缓存数据库,未使用的索引不应进入内存,如果它们进入内存,则会很快再次被逐出。但是,如果您正在构建一个完整的内存中数据库,而没有备份磁盘存储,那么这些索引可能会对您造成伤害。