您好,我对 postgres 中索引的处理有点困惑。我用的是9.6版本。根据我在阅读 postgres 文档和 stackoverflow 的答案后的理解,我想验证以下内容:
- postgres 不支持经典概念的索引
- postgres 中的所有索引都是非聚集索引
- 索引不分配任何新空间,但对表进行排序 这就是创建索引后的 CLUSTER 命令。
- 在文档中指出,在对表进行更新/插入后,索引会自动更新
显示我使用 col1、col2、col3、col4 和基于 col2、col3 的索引创建了一个表。与 col2、col3 相关的选择速度提高了 15 倍。 当我执行 select * from table 时,结果首先显示为基于 col2 排序,然后基于 col3 排序。
当我在表中添加一个新行(具有已经存在的 col2 值 (test_value))时,该行位于表的末尾(这是通过 select * from table 检查的)。
1) 即使全选显示末尾的行,索引是否自动更新为这个新条目?
2) 如果执行查询,所有在 col2 上具有 test_value 的行会发生什么?我会通过索引得到所有结果吗?
最佳答案
这里有一些错误的假设。
最重要的是:除非包含 ORDER BY
,否则 select 中行的顺序是不确定的。因此,您可以获得任何结果,数据库引擎决定是获取数据的更快方法。因此,如果 select * from table
在末尾返回最后插入的元素,则不会告诉您有关索引的任何信息。
行的存储方式和索引信息是分开的
1) 是的,索引在插入后更新。
2) 是的,因为索引已经更新。
关于database - 如果表上有索引,如何处理表更新/插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46572094/