sql - 在 Postgres 中正确创建索引的列顺序
问题描述
考虑Address
具有两text
列的表,City
并且State
。我将实现以下查询:
select * from address where city = $1 and state = $2;
为了能够通过索引进行搜索,我将创建一个索引:
create index address_city_state on address(city,state);
问题是,在索引创建中设置列的顺序,首先是城市而不是州,对查询性能的影响或以任何其他方式,考虑到城市值会比州值变化更多?
解决方案
您通常希望将限制性更强的列放在索引的首位。也就是说,如果city
基数高于state
,那么您将使用(city, state)
。这样做的原因是,从理论上讲,它会允许 Postgres 在到达索引中的第二列之前先过滤掉许多不相关的记录。
但是,您的查询有问题。您正在执行select *
, 这意味着您的索引很可能必须覆盖 select 子句中的所有列,以便 Postgres 决定使用它。例如,如果您的address
表只有另外两列,那么您可以使用此索引:
(city, state, col1, col2)
上面的索引据说覆盖了第三列和第四列col1
,col2
因为这意味着索引本身包含了完成原始查询所需的所有信息。如果您尝试select *
并且您的表有许多其他列,那么 Postgres 可能不会使用您建议的索引。
推荐阅读
- pandas - Pandas 数据框中的分组条目,其中行具有相同的值
- r - 从另一帧中减去一帧的部分内容(并匹配标题)
- javascript - 是否可以从另一个 AJV 定义中引用枚举中的属性名称?
- linux - 如何让 sed 在第一场比赛而不是之后退出?
- python - 如何在 tensorflow 2.0 中支持自定义量化?
- php - How to integrate a vuejs template library into a Laravel project?
- ios - Firebase Pods 不断发布新版本/更改源
- javascript - 条纹输入字段不会显示
- javascript - 如何在对象数组的嵌套数组中获取数组对象javascript
- three.js - Three.js: Not able to combine background pass with outline pass