# 13.6.锁定和索引

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

B-树、GiST和SP GiST索引

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

散列索引

共享/独占哈希桶级别锁用于读/写访问。整个铲斗处理完毕后,锁就会释放。Bucket级别的锁比索引级别的锁提供更好的并发性,但由于锁的保存时间长于一个索引操作,因此可能会出现死锁。

杜松子酒指数

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

目前,B树索引为并发应用程序提供了最佳性能;由于它们还有比散列索引更多的功能,因此对于需要索引标量数据的并发应用程序,它们是推荐的索引类型。在处理非标量数据时,B树没有用处,应该使用GiST、SP GiST或GIN索引。