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