什么类型的索引最适合低选择性的列
What type of index is most suitable for a low-selective column
我有 table 大约 6000 万条记录,它可能很快会增长到 ~500M(然后会缓慢增长)。在 table 中有一列,比如类别。类别总数约为 20K,并且增长非常缓慢且偶尔发生。记录在类别之间分布不均,有些类别占所有记录的 5%,而其他类别只占很小比例的记录。
我有一些查询仅适用于一个或多个类别(使用 =
或 IN
/ANY
条件),我想优化这些查询的性能。
- 考虑到列中数据的低选择性,哪种类型的 Postgres 索引更有利:HASH 还是 B-TREE?
- 还有其他方法可以优化这些查询的性能吗?
对于这个宽泛的问题,我只能给出一个笼统的答案。
使用 B 树索引,而不是哈希索引。
如果你有几个条件不是很有选择性,在每个列上创建一个索引,然后它们可以结合位图索引扫描。
一般来说,选择性不强的列不适合作为索引的候选者。索引不是免费的。它们需要维护,并且在查询时,在大多数情况下,Postgres 仍然必须为索引搜索匹配的每一行输出 table(覆盖索引除外)。
话虽如此,我不确定您的选择性分析。如果您过滤到最坏情况的最高百分比是 5%,而且大多数都远低于该百分比,那么我会说您有一个非常有选择性的列。
至于使用哪种索引类型,b-tree 还是 hash,我通常以 b-tree 索引作为我的标准,除非有特殊需要偏离。
哈希索引比 b 树索引查询速度更快,但是,它们不能用于范围查找,只能用于相等。并非所有 RDBMS 都支持哈希索引,因此社区对哈希索引的了解较少,这可能会阻碍支持。
我有 table 大约 6000 万条记录,它可能很快会增长到 ~500M(然后会缓慢增长)。在 table 中有一列,比如类别。类别总数约为 20K,并且增长非常缓慢且偶尔发生。记录在类别之间分布不均,有些类别占所有记录的 5%,而其他类别只占很小比例的记录。
我有一些查询仅适用于一个或多个类别(使用 =
或 IN
/ANY
条件),我想优化这些查询的性能。
- 考虑到列中数据的低选择性,哪种类型的 Postgres 索引更有利:HASH 还是 B-TREE?
- 还有其他方法可以优化这些查询的性能吗?
对于这个宽泛的问题,我只能给出一个笼统的答案。
使用 B 树索引,而不是哈希索引。
如果你有几个条件不是很有选择性,在每个列上创建一个索引,然后它们可以结合位图索引扫描。
一般来说,选择性不强的列不适合作为索引的候选者。索引不是免费的。它们需要维护,并且在查询时,在大多数情况下,Postgres 仍然必须为索引搜索匹配的每一行输出 table(覆盖索引除外)。
话虽如此,我不确定您的选择性分析。如果您过滤到最坏情况的最高百分比是 5%,而且大多数都远低于该百分比,那么我会说您有一个非常有选择性的列。
至于使用哪种索引类型,b-tree 还是 hash,我通常以 b-tree 索引作为我的标准,除非有特殊需要偏离。
哈希索引比 b 树索引查询速度更快,但是,它们不能用于范围查找,只能用于相等。并非所有 RDBMS 都支持哈希索引,因此社区对哈希索引的了解较少,这可能会阻碍支持。