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
确实存在,但是我不确定为什么数据库没有使用它?还有其他我想念的事情吗?
答案 0 :(得分:3)
在决定使用索引时,数据库考虑了许多因素。
您的查询是:
SELECT *
FROM testtable
WHERE myid = '1:3';
基本上有两种合理的方法:
首先是扫描数据,并将WHERE
子句应用于每一行。
第二种方法是在索引中查找值,然后获取其余数据。
哪个便宜?在您的情况下, first 更便宜。为什么?仅需要将一页从第三级存储移动到内存中。在完成所有加载工作之后,扫描页面非常便宜。
使用索引需要加载两个页面,其中一个用于索引,一个用于数据。
尽管数据库优化很复杂,但这是一个简单的示例,可让您了解优化中使用的各种方法和权衡取舍。