13.6. 锁定和索引

尽管 PostgreSQL 提供了对表数据的非阻塞读/写访问权限,但当前并未为 PostgreSQL 中实现的每种索引访问方法提供非阻塞读/写访问权限。各种索引类型的处理方式如下:

  • B 树,GiST 和 SP-GiST 索引

    • 短期共享/独占页面级锁用于读/写访问。在获取或插入每个索引行后,立即释放锁定。这些索引类型提供了最高的并发性,而没有死锁条件。
  • Hash indexes

    • 共享/专有哈希桶级锁用于读/写访问。处理完整个存储桶后,将释放锁。桶级锁比索引级锁提供更好的并发性,但是死锁是可能的,因为锁持有的时间长于一个索引操作。
  • GIN indexes

    • 短期共享/独占页面级锁用于读/写访问。在获取或插入每个索引行后,立即释放锁定。但是请注意,插入 GIN 索引值通常每行会产生几次索引键插入,因此 GIN 对于单个值的插入可能会做大量工作。

当前,B 树索引为并发应用程序提供最佳性能。由于它们还具有比哈希索引更多的功能,因此它们是需要对标量数据进行索引的并发应用程序的推荐索引类型。当处理非标量数据时,B 树没有用,而应该使用 GiST,SP-GiST 或 GIN 索引。