快速关注索引& Postgres的

时间:2011-08-22 17:37:03

标签: sql postgresql

我在这里有三个列:year,pid(整数)和代码(varchar)。想要为每个人编制索引。哪个更好(我正在使用postgres,但我对系统一般感到好奇):在每三列上全部CREATE INDEX myidx ON mytable USING btree (year, pid, code);或转btree个别索引?

这两种方法的含义是什么?

2 个答案:

答案 0 :(得分:2)

不要在随机列上创建索引,始终根据您使用表的方式创建索引。即如果您将使用SELECT ... WHERE year = 2011 AND pid = 2之类的查询,请在(年,pid)上创建索引。索引允许您更有效地执行某些查询,但它也会占用磁盘空间并使插入更慢。

通过阅读3 ways MySQL uses indexesIndexes in MySQL(两篇简短的博客文章解释MySQL如何处理索引),您可以大致了解哪些索引是好的。请记住,每个DBMS的工作方式都有所不同。

  

哪个更好

唯一有效的答案是 - 它取决于(根据您的使用场景,存储数据量,列选择性等)。

答案 1 :(得分:2)

它们之间的区别如下。假设您有A,B,C列,并且按照这个顺序在它们上放置一个复杂的索引。现在,当你做的时候

 SELECT * from table where A = .. AND B = .. AND C = 

然后将使用索引,这是该索引的最有效用法。

如果您有查询

SELECT * from table where A = ..

然后仍然会使用索引。但是,idnex不会(由于评论更新:或仅部分用于第2和第3个示例)用于:

SELECT * from table where B ..
SELECT * from table where A = .. AND C = .. AND B = ..
SELECT * from table where A = .. AND C = ..
然而,

将再次用于:

SELECT * from table where A = .. AND B = ..
希望这会有所帮助。订单是这里的KEY。当然还有你需要的。如果你有三个问题,比如

SELECT * ... where A
SELECT * ... where B
SELECT * ... where C

然后当然在单列上制作3个索引。但是如果你有AND的查询,首先要确保他们有相同的顺序,然后继续为3列制作1个索引