gpt4 book ai didi

sql - 我如何知道查询中是否使用了任何索引 | PostgreSQL 11?

转载 作者:行者123 更新时间:2023-11-29 14:29:36 25 4
gpt4 key购买 nike

我有点困惑,需要一些建议。我使用 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

youtube 我在sql语句中使用的表有2500万条记录。我认为这就是为什么查询需要 15-17 秒才能完成的原因。对于我使用该查询的 Web 项目,它太长了。我正在尝试加快请求速度。

我为 youtube 表创建这样的索引:

CREATE INDEX youtube_location_idx ON public.youtube USING btree ("CITY", "AREA", "REGION");

在此步骤之后,我再次运行查询,但它需要相同的时间才能完成。查询似乎不使用索引。我如何知道查询中是否使用了任何索引?

EXPLAIN ANALYZE 返回: enter image description here

最佳答案

您通过运行 EXPLAIN 自己回答了标题中的问题.查询计划显示使用了哪些索引以及如何使用。详情参见章节"Using EXPLAIN"在手册中。

至于为什么查询使用顺序扫描且没有索引:2500 万行,删除了 992781 行。您正在获取 24709900 行,这几乎是所有行。

这永远不会很快。
这只会在特殊情况下使用索引。

使用索引通常只对所有行的一小部分有意义。否则只会增加额外的成本。根据许多辅助因素,Postgres 查询计划器开始考虑将 btree 索引用于所有行的大约 5% 或更少。相关:

好吧,如果您的表格行比 SELECT 列表中的三列宽得多,那么(部分)覆盖 索引可能会有所帮助,如果您获得仅索引扫描出来。同样,需要满足一些先决条件。而且每个索引也增加了存储和维护成本。

旁白:一条评论声称 NULL 值无法编入索引。这是不正确的,NULL 值可以被索引。不如其他值有效,但没有太大区别。也与手头的情况无关。

关于sql - 我如何知道查询中是否使用了任何索引 | PostgreSQL 11?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com