我在一个表中有三列:year、pid(integer)和code(varchar)。要为每个索引。哪个更好(我用的是postgres,但我对一般的系统很好奇):在每三列上全部CREATE INDEX myidx ON mytable USING btree (year, pid, code);或单个索引?
这两种方法的含义是什么?

最佳答案

它们之间的区别如下。假设您有列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 = ..

希望这有帮助。顺序是这里的关键。当然还有你需要的。如果你有三个问题
SELECT * ... where A
SELECT * ... where B
SELECT * ... where C

当然,在单列上建立3个索引。但是,如果有使用AND的查询,首先确保它们具有相同的顺序,然后继续为3列创建1个索引

10-07 12:35
查看更多