考虑具有两个Address
列text
和City
的表State
。我将实现以下查询:
select * from address where city = $1 and state = $2;
为了能够按索引进行搜索,我将创建一个索引:
create index address_city_state on address(city,state);
问题是,考虑到城市值比州值变化更大,在索引创建中设置列的顺序,第一个城市而不是州,对查询性能的影响或其他任何影响?
答案 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)
据说上述索引覆盖第三列和第四列col1
和col2
,因为这意味着索引本身包含完成索引所需的所有信息。原始查询。如果您尝试select *
并且表中还有许多其他列,则Postgres可能不会使用建议的索引。