在postgres中使用LIMIT时不使用索引[英] Index not used when LIMIT is used in postgres

本文是小编为大家收集整理的关于在postgres中使用LIMIT时不使用索引的处理方法,想解了在postgres中使用LIMIT时不使用索引的问题怎么解决?在postgres中使用LIMIT时不使用索引问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个带有 (language_id, state) 索引的单词表.以下是 EXPLAIN ANALYZE 的结果:

无限制

explain analyze SELECT "words".* FROM "words" WHERE (words.language_id = 27) AND (state IS NULL);

Bitmap Heap Scan on words  (cost=10800.38..134324.10 rows=441257 width=96) (actual time=233.257..416.026 rows=540556 loops=1)
Recheck Cond: ((language_id = 27) AND (state IS NULL))
->  Bitmap Index Scan on ls  (cost=0.00..10690.07 rows=441257 width=0) (actual time=230.849..230.849 rows=540556 loops=1)
Index Cond: ((language_id = 27) AND (state IS NULL))
Total runtime: 460.277 ms
(5 rows)

限制 100

explain analyze SELECT "words".* FROM "words" WHERE (words.language_id = 27) AND (state IS NULL) LIMIT 100;

Limit  (cost=0.00..51.66 rows=100 width=96) (actual time=0.081..0.184 rows=100 loops=1)
->  Seq Scan on words  (cost=0.00..227935.59 rows=441257 width=96) (actual time=0.080..0.160 rows=100 loops=1)
Filter: ((state IS NULL) AND (language_id = 27))
Total runtime: 0.240 ms
(4 rows)

为什么会这样?我怎样才能让索引在所有情况下都可以使用?

谢谢.

推荐答案

我认为 PostreSQL 查询规划器只是认为在第二种情况下 - 具有 LIMIT 的情况 - 不值得应用索引,因为它 [the LIMIT]太小.所以这不是问题.

本文地址:https://www.itbaoku.cn/post/1763760.html