【发布时间】:2014-12-23 11:25:16
【问题描述】:
我有一个包含 10 万条记录的表,没有索引。我在用于左连接的列上创建了一个新索引。 我需要重新索引我的表吗?
创建索引需要几毫秒。所以我猜在我重新索引我的表之前,查询不能使用这个索引(没有数据)(如果我有其他索引,我只会重新索引索引 - 我阅读了手册)。
新索引填充数据时找不到任何信息?这是自动完成的吗?什么时候?
【问题讨论】:
标签: postgresql indexing reindex
我有一个包含 10 万条记录的表,没有索引。我在用于左连接的列上创建了一个新索引。 我需要重新索引我的表吗?
创建索引需要几毫秒。所以我猜在我重新索引我的表之前,查询不能使用这个索引(没有数据)(如果我有其他索引,我只会重新索引索引 - 我阅读了手册)。
新索引填充数据时找不到任何信息?这是自动完成的吗?什么时候?
【问题讨论】:
标签: postgresql indexing reindex
一旦CREATE INDEX 完成,索引就可以使用了。之后就不需要运行REINDEX了。
来自REINDEXdocumentation page:
REINDEX 类似于索引的删除和重新创建,因为索引内容是从头开始重建的。然而,锁定的考虑是相当不同的。 REINDEX 锁定索引的父表的写入但不读取。
这意味着REINDEX 在DROP 之后的行为类似于CREATE。
从CREATE INDEXdocumentation page:
创建索引可能会干扰数据库的常规操作。通常 PostgreSQL 会锁定要索引的表以防止写入,并通过对表的单次扫描来执行整个索引构建。其他事务仍然可以读取该表,但如果它们尝试在表中插入、更新或删除行,它们将阻塞,直到索引构建完成。
我认为这清楚地解释了创建意味着索引。
特定查询是否使用索引取决于许多不同的事情。如果您的查询不使用索引,您需要发布查询、表定义(例如作为create table 语句)、您定义的索引以及查询的explain (analyze, verbose) 的输出。
【讨论】:
create index 语句完成时,索引已完全构建并准备就绪。