首页 > 解决方案 > 在同一列上创建 2 个索引

问题描述

我有一个带geometry列的表。

我在此列上有 2 个索引:

create index idg1 on tbl using gist(geom)

create index idg2 on tbl using gist(st_geomfromewkb((geom)::bytea))

我有很多使用geom( geometry) 字段的查询。

  1. 使用哪个索引?(何时以及为什么)
  2. 如果同一列上有两个索引(如我在此处显示的那样),select queries运行速度是否比仅在列上定义一个索引慢?

标签: postgresqlpostgis

解决方案


索引的使用取决于索引的定义方式以及查询的调用方式。如果你SELECT <cols> FROM tbl WHERE geom = <some_value>,那么你将使用idg1索引。如果你SELECT <cols> FROM tabl WHERE st_geomfromewkb(geom) = <some_value>,那么你将使用idg2索引。

知道哪个索引将用于特定查询的一个好方法是使用EXPLAIN(ie, EXPLAIN SELECT <cols> FROM tbl WHERE geom = <some_value>) 调用查询——这将打印出查询计划、将使用哪些访问方法、哪些索引、哪些连接等。

对于您关于性能的问题,SELECT查询可能会运行得更慢,因为在查询计划阶段需要考虑更多索引。在执行给定的查询计划方面,SELECT查询不会运行得更慢,因为到那时查询计划已经建立并且已经决定使用哪个索引。

您肯定会体验到对表的性能影响INSERT,因为所有索引都需要根据表中的更改进行更新UPDATEDELETE因此,磁盘上将有额外的 I/O 活动来传播更改,从而降低数据库速度,尤其是在规模上。


推荐阅读