当前位置: 首页 > 知识库问答 >
问题:

为什么我的文章没有在几何领域使用索引?

何辰沛
2023-03-14

postgreql 9.5 postgis 2.2在窗口。我首先创建一个表:

CREATE TABLE points (
  id   SERIAL,
  ad   CHAR(40),
  name VARCHAR(200)
);

然后,添加一个几何字段geom:

select addgeometrycolumn('points', 'geom', 4326, 'POINT', 2);

并在上面创建gist索引:

CREATE INDEX points_index_geom ON points USING GIST (geom);

然后,我将大约1,000,000点插入表中。

我想查询距离给定点在给定距离内的所有点。这是我的sql代码:

SELECT st_astext(geom) as location FROM points
WHERE st_distance_sphere(
     st_geomfromtext('POINT(121.33 31.55)', 4326),
     geom) < 6000;

结果就是我想要的,但是太慢了。当我对这段代码explain analyze verbose时,我发现它没有使用points\u index\u geom(explain显示seq scan和no index)。

所以我想知道为什么它不使用索引,我应该如何改进?

共有1个答案

江英华
2023-03-14

您不能期望ST_Distance_Sphere()在此查询中使用索引。您正在对geom字段的内容进行计算,然后对计算结果进行比较。在这种情况下,数据库可能不会使用索引,除非您有一个与查询中的计算几乎相同的函数索引。

正确的方法来寻找位置与在一个给定的距离从某一点是使用ST_DWithin

ST_DWithin-如果几何在指定的距离内,则返回true。对于几何单位是空间参考的单位,对于地理单位是米,测量默认为use_spheroid=true(围绕球体测量),为了更快地检查,use_spheroid=false沿球体测量。

此函数调用将自动包括边界框比较,该比较将使用几何图形上可用的任何索引。

 类似资料:
  • 问题内容: 我有2张表,如下所示: 当我解释查询时: postgres给我这个: 过了一会儿给我这个完全相同的查询(仍然不使用索引): 我的问题是:如果我仅按构成唯一索引的st值和类型值进行过滤,为什么不使用此唯一索引? 问题答案: 您的表没有足够的行来使用索引。它们适合放在单个磁盘页面中,因此使用cpu时间读取整个内容并筛选出行要比两次执行同​​一操作(一次用于索引,另一次用于数据)要快。

  • 我正在试验微服务和前端之间的角色映射(在Keycloak术语中是keycloak-clients)。 假设我有两个keycloak客户端: 路由管理-API 路由管理-WebApp 你对这种做法有什么看法?是正确的思维方式吗?我们需要王国角色做什么?

  • 我有一个带有索引的ISODate()类型字段的数据库(我也用字符串字段尝试了这个实验——结果相同)。我使用的是MongoDB(4. x)的开源版本,当我进行查询/排序以查找最大_finish_time时,除非我指定提示,否则不会使用索引。 我的问题是: 这解释为: 扫描整个收藏。当我为可用索引指定提示时,如: 我得到了查询计划: 它使用索引。我不想在查询中添加hint(),我对它为什么拒绝使用索引

  • 我使用MVC页面中的Kendo DatePicker值构建了一个模型: 但是,如果我输入值,而不是单击日历并选择日期,它在这里不会得到值。我怎样才能得到这个数据?

  • 根据digitalocean教程,我用我的ELK节点作为RedHat服务器设置了ELK stack和filebeat。Kibana已启动并运行,但当我将索引模式配置为logstash-*时,我看不到任何logstash索引: 当我做卷曲以查看我的索引时,它们只是filebeat索引。Filebeat应该将数据推送到正在监听5044的logstash 您可以看到我只有filebeat索引。我检查了我

  • 我正在尝试更新名为的数据库中名为的表。该表的主键是。 当我运行以下语句时: 我收到一个错误,上面写着“您正在使用安全更新模式,并且您试图更新一个没有使用键列的WHERE的表。” 我在谷歌上搜索了那个错误消息,大多数回复都是“你必须使用子句或关闭安全模式”。但正如您所看到的,我使用的是子句。如果我有子句,为什么会出现错误? MySQL服务器版本5.6。20