我在Postgres数据库中有许多只读表。可以使用任何列组合查询所有这些表。
如何优化查询?向所有表的所有列添加索引是一个好主意吗?
答案 0 :(得分:12)
用于过滤或加入(或在较小程度上,排序)的列对索引感兴趣。刚刚选择的列几乎没有相关性! 对于以下查询,只有 a 和 e 上的索引可能有用:
SELECT a,b,c,d
FROM tbl_a
WHERE a = $some_value
AND e < $other_value;
此处, f 以及可能 c 也是候选人:
SELECT a,b,c,d
FROM tbl_a
JOIN tbl_b USING (f)
WHERE a = $some_value
AND e < $other_value
ORDER BY c;
创建索引后,测试它们是否真的对EXPLAIN ANALYZE
有用。还可以比较使用和不使用索引的执行时间。删除和重新创建索引非常简单快捷。 experiment还有EXPLAIN ANALYZE
的参数。差异可能是惊人的或不存在的
由于您的表是只读的,索引维护很便宜。它只是一个光盘空间的问题。
如果你真的想知道自己在做什么,start by reading the docs。
尝试记录足够的查询以查找典型用例。使用参数log_statement = all
记录查询。或者只使用log_min_duration_statement
记录慢查询。
创建可能有用的indexes并在一段时间后查看统计信息,以查看实际使用的内容。 PostgreSQL为monitoring statistics提供了完整的基础设施。研究统计数据(以及许多其他任务)的一种便捷方法是pgAdmin,您可以在其中选择表/函数/索引并获取&#34;统计数据中的所有数据。对象浏览器(主窗口)中的选项卡。
按上述步骤继续查看使用中的索引是否真正加快了速度。
如果查询计划程序应该选择使用一个或多个索引但没有或产生不利影响,那么您的设置可能出现问题,您需要学习the basics of performance optimization: vacuum, analyze, cost parameters, memory usage, ...
答案 1 :(得分:0)
如果您按更多列过滤索引可能有帮助,但不能过多。索引也可能对小表没有帮助。
首先搜索“postgresql tuning” - 你会发现有用的信息。
如果数据库可以适合内存 - 购买足够的RAM。 如果数据库无法适应内存 - SSD会有所帮助。 如果这还不够,并且数据库是只读的 - 运行2,3或更多服务器。或分区数据库(在最好的情况下,以适应每个服务器的内存)。
即使生成了查询,我认为它们也不是随机的。监视数据库以查找慢速查询并仅改进它们。