【发布时间】:2019-05-08 19:57:23
【问题描述】:
我有点困惑,需要一些建议。我使用PostgreSQL 11 数据库。我有这么简单的sql语句:
SELECT DISTINCT "CITY", "AREA", "REGION"
FROM youtube
WHERE
"CITY" IS NOT NULL
AND
"AREA" IS NOT NULL
AND
"REGION" IS NOT NULL
我在sql语句中使用的youtube表有2500万条记录。我认为这就是为什么查询需要 15-17 秒才能完成。对于我使用该查询的 Web 项目,它太长了。我正在尝试加快请求速度。
我为 youtube 表创建了这样的索引:
CREATE INDEX youtube_location_idx ON public.youtube USING btree ("CITY", "AREA", "REGION");
在这一步之后,我再次运行查询,但需要同样的时间才能完成。似乎查询不使用索引。我如何知道查询中是否使用了任何索引?
【问题讨论】:
-
它没有使用索引。它正在对表进行全表扫描(Seq Scan)。
-
好像是这样。那么我怎么能告诉 PostgreSQL 11 数据库使用我创建的特定索引呢?
-
它可能永远不会使用该索引,而优化器会选择执行全表扫描。 NULL 不会被索引,因此 NOT NULL 不一定由您刚刚构建的索引提供帮助。阅读this prior question/answer
-
你在表中存储了哪些记录,它的主键是什么?如果 Area、region 等独立于主键,则应考虑为 AREA、REGION 和 CODES 设置单独的表,并仅使用外键将它们的 id 存储在主表中。
标签: sql postgresql sql-execution-plan postgresql-performance