我应该在postgresql 9.3中使用hash或btree作为外键索引吗?

时间:2014-10-10 10:20:25

标签: hash foreign-keys postgresql-9.3

对于postgresql 9.3中的整数类型的外键,哪个索引表现更好?

我假设一个哈希索引,因为外键comparisson总是用=

或者,当用于外键上的JOINS时,btree与哈希的比较速度是否快?

因为在postgresql主键中使用btree,这表明它们对外键也更好。

3 个答案:

答案 0 :(得分:6)

来自manual On PostgreSQL 9.3

  

警告哈希索引操作目前不是WAL记录的,所以哈希   数据库崩溃后,可能需要使用REINDEX重建索引   如果有不成文的变化。此外,哈希索引的更改不是   在初始化之后通过流式传输或基于文件的复制进行复制   基本备份,因此他们为随后的查询提供错误的答案   使用它们。由于这些原因,目前不鼓励使用哈希索引。

也没有证据表明哈希索引比btree具有任何性能优势。

答案 1 :(得分:0)

你能解释一下如何在内部创建外键吗?当我在创建约束时运行iostat时,没有写入磁盘但是有许多读取。对于单线程PostgreSQL系统,创建外键的过程非常I / O(读取)和CPU密集型。

答案 2 :(得分:0)

这取决于。

如果您不使用外键进行任何查询,请you don't need any index。引用完整性是通过引用的主键的索引来强制实现的。

因此,对于任何列,要使用哪种索引类型(如果有)的问题是相同的。如果您的查询将从索引中受益=,并且您使用的是PostgreSQL 10或更高版本,那么HASH索引是一个合理的选择。如果同一列涉及任何排序操作(ORDER BY<>=等),那么您也可以使用BTREE。

如果您非常关注相对性能,则需要使用自己的数据分布和查询负载自己进行测试。由于数据访问的位置(顺序与随机),树索引的性能可能仍优于散列。