当前位置: 首页 > 面试题库 >

为什么Postgres没有在查询中使用索引

贺兴平
2023-03-14
问题内容

我有2张表,如下所示:

tb_st:
Columns:
st_id  | integer
st     | character varying(80)
type   | integer
Indexes:
    PRIMARY KEY (st_id)
    UNIQUE INDEX (st, type)
    INDEX (st)

tb_pd:
Column
st_id  | integer
bot_id | integer
Indexes:
    PRIMARY KEY (st_id, bot_id)
    INDEX (bot_id)
Foreign-key constraints:
    FOREIGN KEY (st_id) REFERENCES tb_st(st_id)

当我解释查询时:

select p.bot_id
from tb_pd p inner join
     tb_st s
     on p.st_id = s.st_id
where s.st = 'abc' and s.type = 1

postgres给我这个:

 Nested Loop  (cost=4.24..16.10 rows=11 width=194)
   ->  Seq Scan on tb_st s  (cost=0.00..1.07 rows=1 width=186)
         Filter: (((st)::text = 'abc'::text) AND (type = 1))
   ->  Bitmap Heap Scan on tb_pd p  (cost=4.24..14.91 rows=11 width=8)
         Recheck Cond: (st_id = s.st_id)
         ->  Bitmap Index Scan on tb_pd_pkey  (cost=0.00..4.24 rows=11 width=0)
               Index Cond: (st_id = s.st_id)
(7 rows)

过了一会儿给我这个完全相同的查询(仍然不使用索引):

 Nested Loop  (cost=0.00..2.19 rows=1 width=4)
   Join Filter: (p.st_id = s.st_id)
   ->  Seq Scan on tb_st s  (cost=0.00..1.07 rows=1 width=4)
         Filter: (((st)::text = 'abc'::text) AND (type = 1))
   ->  Seq Scan on tb_pd p  (cost=0.00..1.05 rows=5 width=8)
(5 rows)

我的问题是:如果我仅按构成唯一索引的st值和类型值进行过滤,为什么不使用此唯一索引?


问题答案:

您的表没有足够的行来使用索引。它们适合放在单个磁盘页面中,因此使用cpu时间读取整个内容并筛选出行要比两次执行同​​一操作(一次用于索引,另一次用于数据)要快。



 类似资料:
  • 问题内容: 我有一张表,其中有一个名为的整数列。我在该列上有一个索引。 但是似乎Postgres不想使用我的索引: 知道为什么会这样吗? 问题答案: 因为: 您选择的行太多了,以至于读取整个表都比较便宜。

  • 问题内容: 我有一个表,其中列上有部分索引。 如果我执行简单查询,则使用索引: 但是如果我使用它进行查询,则不会使用索引: 为什么在第二种情况下不使用索引?有什么办法可以加快这个查询? (请注意,在此示例中,我已截断了数组,并测试了更多元素,但结果却相同,缓慢) 问题答案: 实际上,它 正在 使用索引。只是做不同的事情。 索引扫描一行一行地访问,以随机顺序从一个磁盘页面到下一个磁盘页面来回移动。

  • 问题内容: 我有一个查询,在我认为可能不使用索引的情况下,出于好奇,我将其重现: 创建一个具有1.000.000行(在中有10个不同的值,在中有500个字节的数据)的。 创建一个索引并收集表统计信息: 尝试获取和的不同值: 不使用索引,前提是提示不会更改。 我想在这种情况下不能使用索引,但是为什么呢? 问题答案: 我运行了Peter的原始内容并复制了他的结果。然后我应用了dcp的建议… 之所以如此

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

  • 问题内容: 我试图弄清楚为什么我的查询之一变慢以及如何解决它,但是我对结果有些困惑。 我有一个约80列和775179行的表,并且正在执行以下请求: 在4.5秒内返回38行 删除时,我得到了很好的改进: 0.30秒内38行 但是,如果在不触摸的情况下删除,我会得到更好的结果: 0.10s(??)中的38行 为什么我的LIMIT这么饿? 继续前进 在尝试发送答案之前,我尝试了一些尝试,并注意到我有一个

  • postgreql 9.5 postgis 2.2在窗口。我首先创建一个表: 然后,添加一个几何字段geom: 并在上面创建gist索引: 然后,我将大约1,000,000点插入表中。 我想查询距离给定点在给定距离内的所有点。这是我的sql代码: 结果就是我想要的,但是太慢了。当我对这段代码时,我发现它没有使用points\u index\u geom(explain显示seq scan和no i