首页 > 解决方案 > 在 Postgres 中正确创建索引的列顺序

问题描述

考虑Address具有两text列的表,City并且State。我将实现以下查询:

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

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

create index address_city_state on address(city,state);

问题是,在索引创建中设置列的顺序,首先是城市而不是州,对查询性能的影响或以任何其他方式,考虑到城市值会比州值变化更多?

标签: sqlpostgresqlindexing

解决方案


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

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

(city, state, col1, col2)

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


推荐阅读