一个非常实际的例子:
假设用户表有一个存储时间戳的“已删除”列。假设几乎每个访问该表的查询都有一个“deleted IS NOT NULL”过滤器。该字段很少不为空,并且当它为空时,它通常非常短暂。
问题:
- 有必要索引吗?虽然该列的熵通常为1,但我认为 Postsgresql 不会在不创建索引的情况下跟踪熵,这意味着它需要对每个查询进行全表扫描(可能是最后一个操作,但是还是哎哟!)
- 假设我不需要 B 索引中的所有其他运算符,将这个索引预先优化为哈希索引而不是 B 索引是否有意义?由于熵接近 1,我认为两个索引之间实际上并没有很大的大小差异,因此 B-Index 会更好。
不,索引
deleted
不会有帮助,因为该条件消除了太少的行以保证索引扫描。但是,如果您的所有查询都包含
WHERE deleted IS NOT NULL
,您可以创建具有相同WHERE
条件的所有索引。这样的“部分索引”可以与这些查询一起使用,它们会自动从结果集中排除不满足该条件的行。因此,您已经对条件进行了索引,而无需创建额外的索引!