索引对使用 && 的相交查询没有影响

Posted

技术标签:

【中文标题】索引对使用 && 的相交查询没有影响【英文标题】:Index has no effect on intersect query using && 【发布时间】:2016-01-19 03:38:06 【问题描述】:

我在 PostgreSQL 数据库中有一个表,它是使用以下命令通过 QGIS DB Manager 创建的。 geom 列包含大约 500,000 个六边形多边形,而 centroid 列存储这些六边形的质心。 id 只是分配给每个的唯一值。

CREATE TABLE public.hex15p625
(
  id integer NOT NULL DEFAULT nextval('"Hex15p625_id_seq"'::regclass),
  geom geometry(Polygon,4326),
  centroid geometry(Point,4326),
  CONSTRAINT "Hex15p625_pkey" PRIMARY KEY (id)
)

我正在使用以下查询以 GeoJSON 的形式返回边界框内的任何六边形:

SELECT id, ST_AsGeoJSON(geom) AS geom, ST_AsGeoJSON(centroid) AS centroid
FROM public.hex15p625
WHERE 
  ST_Shift_Longitude(public.hex15p625.geom) && 
  ST_Shift_Longitude(ST_MakeEnvelope(-86.0057, 48.8199, -85.6854, 48.9955, 4326));

为了加快查询速度,我创建了两个索引,但在上面的用例中只使用了一个:

CREATE INDEX "sidx_Hex15p625_geom"
  ON public.hex15p625
  USING gist
  (geom);
ALTER TABLE public.hex15p625 CLUSTER ON "sidx_Hex15p625_geom";

还有这个,为了完整起见,我把它放在这里:

CREATE INDEX "sidx_Hex15p625_centroid"
  ON public.hex15p625
  USING gist
  (centroid);

在进行上述查询时,我发现查询之前大约需要 700 毫秒,而在我创建空间索引之后则需要 700 毫秒。为了仔细检查,我复制了上表,删除了两个索引,并对两者运行了相同的查询,得到了几乎完全相同的结果。

是否有什么东西阻止查询使用我创建的索引?

【问题讨论】:

【参考方案1】:

虽然我不完全确定(我从来没有遇到过这个问题),但很可能是使用了ST_Shift_Longitude()gist 索引适用于原始几何形状的框,但您可以使用该函数明确地改变西半球的几何形状。您可以尝试在函数结果上建立索引,看看是否有帮助:

CREATE INDEX "sidx_Hex15p625_geom_shift"
  ON public.hex15p625
  USING gist (ST_Shift_Longitude(geom));

【讨论】:

以上是关于索引对使用 && 的相交查询没有影响的主要内容,如果未能解决你的问题,请参考以下文章

mongodb建立索引&查看索引&删除索引

PHP & MySQL数据库专题 第十一课 索引

PHP & MySQL数据库专题 第十一课 索引

PHP & MySQL数据库专题 第十一课 索引

Oracle-DDL 2- 视图&索引

MySQL字符串索引&脏页刷盘