每次更新数据库时都需要发出 CREATE INDEX 吗?

Nic*_* Yu 5 sql database sqlite database-design

我有一个地理地图数据库,其中包含 x、y、z、缩放和类型列。最初使用call时读取速度很慢

SELECT image WHERE x = ... AND y=... AND zoom=... AND type =...
Run Code Online (Sandbox Code Playgroud)

感谢堆栈溢出的帮助,我发现 (x,y,z,zoom) 的索引显着提高了读取速度。

但是,我有一个问题,这个 CREATE INDEX 命令只需要在数据库第一次初始化时发出一次吗?而且即使数据库逐渐长大,它仍然会享受索引带来的读取速度提升吗?

或者我是否需要每次关闭应用程序之前发出 CREATE INDEX 命令(在应用程序期间,数据库会增长)?

ole*_*sii 5

您只需要创建一次索引。

数据库将记住带有索引的列,并将随着表一起不断更改索引。

如果向表中插入条目,它将被添加到索引中。如果您更改条目 - 它将在索引中进行修改。最后,如果您删除一个条目 - 它将从索引中删除。

请注意,索引将加快您SELECT在索引列上的搜索操作,但会降级INSERT, UPDATE, DELETE

  • 但请注意,为了将索引用于特定查询,需要收集并存储有关表和索引的统计信息。如果表中的数据以及索引中的数据发生很大变化,您可能必须刷新这些统计信息。您可以使用命令“analyze <tablename>;”来执行此操作。第二个注意事项:即使您有索引并且统计数据良好,查询规划器也可能决定不使用索引,因为它找到了更有效的执行路径.第三个节点:由于您正在处理空间数据,因此您可能会看看spatialite扩展。 (2认同)