12.5. 锁和索引

尽管 PostgreSQL 提供对表数据访问的非阻塞的读/写,但并非所有 PostgreSQL 里实现的索引访问模式都能够进行非阻塞读/写。 不同的索引类型按照下面方法操作∶

B-tree 和 GiST 索引

短期的页面级共享/排他锁用于读/写访问。 锁在索引行被插入/抓取后立即释放。 这种索引类型提供了无死锁条件的最高级的并行性。

Hash (散列)索引

散列桶级别的共享/排他锁用于读/写访问。锁在整个散列桶处理完成后释放。 散列桶级锁比索引级的锁提供了更好的并行性但是可能产生死锁,因为锁持有的时间比一次索引操作时间长。

R-tree 索引

索引级别的共享/排它锁用于读/写访问。 在整个命令完成之后,释放锁。

目前,B-tree 索引为并发应用提供了最好的性能; 因为它们还有比散列索引更多的特性,在那些需要对标量数据进行索引的并发应用中, 我们建议使用这种索引类型。 在处理非标量类型数据的时候,B-tree 就没什么用了;而应该使用 GiST 索引。 R-tree 索引已经废弃了,在将来的版本里很可能完全消失。