我有一个大约有250万行的表,我正考虑进入一个更大的表,3500万行,并在原来的250万行上设置一个布尔标志。
如果我想对新的大表中的250万条记录运行大量查询,那么添加索引是否有用/不会导致每个查询都进行全表扫描?我知道传统的索引对布尔值没有帮助,但由于只有7%的记录是真的,我认为可能不需要对每个查询进行表扫描。
答案 0 :(得分:2)
或许看一下使用partial index。
来自文档
部分索引是在表的子集上构建的索引;子集 由条件表达式定义(称为谓词的谓词) 部分指数)。索引仅包含那些表行的条目 满足谓词。
部分索引的主要动机是避免索引常见 值。由于查询搜索公共值(一个帐户 超过所有表行的百分之几)将不会使用 无论如何,索引中的那些行没有任何意义 所有。这会减小索引的大小,从而加快查询速度 那个确实使用索引。它还将加速许多表更新 操作,因为索引不需要在所有情况下更新。 例11-1显示了这个想法的可能应用。
答案 1 :(得分:0)
如果您想要有效访问该表的很大一部分,我会考虑分区。
答案 2 :(得分:0)
如果您执行"从小"插入big select *,那么来自小表的所有行可能在物理上彼此靠近。分析完表后,PostgreSQL会知道这一点,因此可能会选择使用布尔值上的索引。
但是,如果行中有很多流失,那么最终" true"行和" false"行将变得混乱,使用索引越来越少有效,PostgreSQL将停止使用它。
通过使用分区/继承,您可以将行保持物理分离(以便更快地对小集进行顺序扫描),同时使它们看起来像您想要的单个数据集。
根据您运行的查询的性质,您可能还可以将其他列添加到索引中,将布尔列保留为第一列。