正确在Postgres中创建索引的列顺序

时间:2019-04-19 09:20:34

标签: sql postgresql indexing

考虑具有两个AddresstextCity的表State。我将实现以下查询:

select * from address where city = $1 and state = $2;

为了能够按索引进行搜索,我将创建一个索引:

create index address_city_state on address(city,state);

问题是,考虑到城市值比州值变化更大,在索引创建中设置列的顺序,第一个城市而不是州,对查询性能的影响或其他任何影响?

2 个答案:

答案 0 :(得分:1)

对于此查询:

where city = $1 and state = $2

先输入哪个键都没有关系。这两个键都将用于查找(使用索引查找)特定行。

如果{em}总是一起使用city / state,并且=总是一起使用{em> ,那么我可能会把首先state,然后city,因为它遵循地理层次结构。但是,我认为没有任何性能上的好处。

如果还有其他潜在查询,则可能会影响键的顺序。

当并非所有键在=子句中都具有where比较时,键的顺序很重要。在这里似乎并非如此。

答案 1 :(得分:0)

通常,您希望将限制性更强的列放在索引的第一位。也就是说,如果city的基数比state高,那么您将使用(city, state)。这样做的原因是,从理论上讲,它将允许Postgres首先过滤掉许多不相关的记录,甚至没有达到索引的第二列。

但是,您的查询有问题。您正在做select *,这意味着您的索引很可能必须覆盖select子句中的所有列,以便Postgres决定使用它。例如,如果您的address表只有另外两列,则可以使用此索引:

(city, state, col1, col2)

据说上述索引覆盖第三列和第四列col1col2,因为这意味着索引本身包含完成索引所需的所有信息。原始查询。如果您尝试select *并且表中还有许多其他列,则Postgres可能不会使用建议的索引。