我的桌子上有大约6000万条记录,并且可能很快就会增长到约5亿(然后会缓慢增长)。表格中有一列,即类别。类别的总数大约为2万,并且有时会非常缓慢地增长。记录在各类别之间分布不均,有些类别占所有记录的5%,而其他类别仅占很小一部分记录。
我有一些仅适用于一个或多个类别(使用=
或IN
/ ANY
条件)的查询,并且我想优化这些查询的性能。
答案 0 :(得分:1)
对于这个广泛的问题,我只能给出一个概括的答案。
使用B树索引,而不是哈希索引。
如果您有几个条件不是非常有选择性,请在每列上创建一个索引,然后将它们与位图索引扫描结合起来。
答案 1 :(得分:1)
通常,选择性不高的列不是索引的理想选择。索引不是免费的。它们需要维护,并且在查询时,在大多数情况下,Postgres仍然必须为索引搜索匹配的每一行走到表中(例外是覆盖索引)。
话虽如此,我不确定您的选择性分析。如果您要过滤到最坏情况的最高百分比是5%,而大多数百分比远低于该百分比,那我想您有一个非常有选择性的栏。
对于要使用的索引类型(b树与哈希),除非特别需要偏离,否则我通常将b树索引作为我的标准。
哈希索引比b树索引的查询速度更快,但是,它们不能用于范围查找,而只能用于相等查找。并非所有RDBMS都支持哈希索引,因此,社区对此哈希索引的了解较少,这可能会阻碍支持。