postgresql - PostgreSQL 多列索引,包括数组
问题描述
文档建议对数组列使用 GIN 索引。但是,我想通过该列和布尔列的组合进行查询,并且我无法将布尔值添加到索引中,因为 GIN 不支持该类型。我最好(a)为布尔列创建单独的索引,(b)使用不同的索引类型(哪个?),或者(c)不索引布尔列,因为在我的情况下,搜索结果集数组列索引只有几行,所以如果查询优化器在其中搜索匹配的布尔值,它只会进行少量比较?
create table foo (
id integer generated by default as identity primary key,
...
bar bool not null, -- TODO: Separate index? Cannot include bool in GIN index
...
baz smallint[] not null);
create index foo_baz_idx on lambdas using gin (baz);
大多数查询将采用的形式,并且在单独select * from foo where X = any(baz) and bar = Y
搜索中最多会有少量行X
解决方案
这实际上取决于您的数据的性质。如果where X = any(baz)
导致少量行,则无需索引bar
。
如果where X = any(baz)
导致大量行,单独的索引bar
可能会有所帮助;它会给查询计划者更多的选择。但由于它是一个布尔值,您可以改为在bar
. 然后每个查询都有效地在where bar = ?
.
在某些情况下,查询性能可以显着提高,尤其是当表的大部分访问量很大的行位于单个分区或少数几个分区中时。分区替代了索引的前导列,减少了索引大小,并使索引的大量使用部分更有可能适合内存。
当查询或更新访问单个分区的大部分时,可以通过利用该分区的顺序扫描而不是使用分散在整个表中的索引和随机访问读取来提高性能。
推荐阅读
- wordpress - Wordpress:在自定义帖子类型 slug 中添加自定义分类将其他页面重定向到主页
- websphere - IBM Watson Studio - 云对象存储
- css - CSS/Vue.js 将动画重置与 ref 值更改同步
- node.js - Node.js aws s3 sdk v3 在放置对象时显示错误
- c# - 控制台应用程序构建为 Windows 应用程序
- amazon-web-services - AWS AppSync Lambda 授权方
- linux - Bash check arg value
- c++ - 即使已安装 cmake 也找不到 QtQuick
- java - 进度条在括号外
- heroku - 无法 git push heroku main