没有使用Postgres索引

时间:2019-03-22 21:04:03

标签: sql postgresql indexing

Postgres的新手,对RDBMS的总体工作不太熟悉。我读到,在某些情况下,在表中添加索引可以提高数据库的查询性能。我用一张桌子试了一下(Postgres v11.2):

CREATE TABLE testtable(
    idString text,
    comment text
);


INSERT INTO 
    testtable(idString, comment)
VALUES
    ('1:2', 'some text'),
    ('12:2', 'blah'),
    ('2:2', 'other text'),
    ('1:3', 'blah'),
    ('33:2', 'blah');


CREATE INDEX myindex ON testtable(idString asc);

我正在阅读的指南说,在没有索引的情况下,数据库通常会对所有条目进行“顺序扫描”,直到找到查询为止,而在有索引的情况下,它会进行“索引扫描”。该指南说要使用“ EXPLAIN”查看查询计划,所以我这样做:

EXPLAIN SELECT * FROM testtable WHERE myid = '1:3';

但是,输出似乎仍然是顺序扫描:

                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on testtable  (cost=0.00..1.07 rows=1 width=64)
   Filter: (myid = '1:3'::text)
(2 rows)

我已经使用pgAdmin进行了检查,发现myindex确实存在,但是我不确定为什么数据库没有使用它?还有其他我想念的事情吗?

1 个答案:

答案 0 :(得分:3)

在决定使用索引时,数据库考虑了许多因素。

您的查询是:

SELECT *
FROM testtable
WHERE myid = '1:3';

基本上有两种合理的方法:

首先是扫描数据,并将WHERE子句应用于每一行。

第二种方法是在索引中查找值,然后获取其余数据。

哪个便宜?在您的情况下, first 更便宜。为什么?仅需要将一页从第三级存储移动到内存中。在完成所有加载工作之后,扫描页面非常便宜。

使用索引需要加载两个页面,其中一个用于索引,一个用于数据。

尽管数据库优化很复杂,但这是一个简单的示例,可让您了解优化中使用的各种方法和权衡取舍。