在Postgres的指数?

问题描述:

INDEX表达式有什么作用?在最后一个例子:在Postgres的指数?

CREATE TABLE tags (
    tag_id      varchar(255) NOT NULL, 
    "{Users}{userID}question_id" int4 NOT NULL, 
    tag       varchar(20), 
    CONSTRAINT tag 
    PRIMARY KEY (tag_id)); 
CREATE INDEX tags_tag 
    ON tags (tag); 
+5

你这样的人冷静地问这样的问题怎么了?这是一个非常有效的问题,事实上,有很多人认为他们知道数据库的所有信息,无法解释索引是如何工作的。 – 2009-07-30 22:32:50

一个index是一个数据库结构,其能够帮助到数据库中,当在搜索基于在索引字段(一个或多个)的各行高速访问。

在您的示例中,CREATE INDEX语句使用列tag在表tags上创建了名为tags_tag的索引。如果您想根据tag字段从表中搜索行,数据库可能会使用索引更有效地查找行。没有索引,数据库可能不得不求助于表的全面扫描,这可能需要更长的时间(取决于许多因素,如表的大小,值的分布,确切的查询条件)。不同的数据库还支持不同类型的索引,可用于以不同方式搜索数据。

索引还有一个缺点:对于每个索引,该表的写入速度都会下降。如果插入一行,有一个索引意味着除了数据库写入行本身之外,它还必须更新索引。

决定将索引放在哪个列上可能会非常棘手,并且与往常一样,对照实际数据的基准测试或实际查询是衡量性能的最准确的方法。一般来说,您需要索引到您要搜索的列上。因此,如果您想要查找连续的tag,那么将索引放在那里肯定有意义。但是,如果你有一个地址簿,你可能(可能)不需要在街道,邮政编码或邮政编码或电话号码上搜索,所以它不值得写入性能。

您的主键列几乎总是会有一个由数据库自动生成的索引。如果您想保持特定列的值不同,可以创建一个UNIQUE INDEX来执行此操作。

This SO问题询问有关数据库索引的经验法则,这可能很有用。

+0

当你应该索引时,是否有某种类型的thumbrules?我在这个例子中直觉地选择了索引,因为SO风格的标签可能会使访问速度成为瓶颈。 – 2009-07-30 22:39:13