尽管 PostgreSQL 提供了对表数据的非阻塞读/写访问,但目前 PostgreSQL 中实现的每个索引访问方法并不都能提供非阻塞读/写访问。各种索引类型的处理方式如下
短时间共享/独占页级锁定用于读/写访问。每个索引行被获取或插入之后会立即释放锁定。这些索引类型提供最高并发性,并且没有死锁条件。
共享/独占哈希桶级锁定用于读/写访问。整个哈希桶被处理后才会释放锁定。桶级锁定比索引级锁定提供了更好的并发性,但可能会出现死锁,因为锁定持续时间比一个索引操作的时间长。
短时间共享/独占页级锁定用于读/写访问。每个索引行被获取或插入之后会立即释放锁定。但请注意,插入 GIN 索引的值通常会为每行产生多个索引密钥插入,因此 GIN 可能为单个值的插入执行大量工作。
目前,B 树索引为并发应用程序提供了最佳性能;由于它们还比哈希索引具有更多特性,因此它们是对需要索引标量数据的并发应用程序的推荐索引类型。在处理非标量数据时,B 树没用,应当改用 GiST、SP-GiST 或 GIN 索引。