我有一个在Heroku上托管的Postgres 9.6数据库(标准4,带15GB缓存)。
我的一个表有几乎100M的行,而且该表平均每分钟可以获得3k次插入/更新,但这可能会达到10倍。
我有几个针对该表运行的查询基本上计算具有不同值的不同列的行。
我还有一份当前没有更新的数据库副本(基本上是空闲的)。
对实时数据库的查询比副本上的查询慢得多,我不知道这是由于更新的加载/争用还是我的查询优化不佳。
查询所计算的值是非常常见的值。
select count(*)
from my_table
where a = '123'
and b = 'abc'
123
和abc
的组合有很多行。我为此创建了一个部分索引:
create index my_table_abc_123_index
on my_table (a, b)
where a = '123' and b = 'abc'
这似乎让我得到一个索引,只扫描副本上的快速(~0.5s),但在实时DB(~26s)上慢得多。成本也差异很大(先复制,直播第二):
Aggregate (cost=29751.39..29751.39 rows=1 width=8)
Aggregate (cost=179603.59..179603.59 rows=1 width=8)
这两个都返回大约1.4M的计数,表格大小相同。
当写入速度提高(10倍)时,降级也很明显。
有趣的是,Postgres并不总是选择我的部分索引,选择(a, b)
上的完整复合索引,具体取决于为这些列传递的值。
我已经阅读了Postgres索引文档,并意识到对于常见值,使用索引并不总是最好(尽管Postgres在所有这些情况下都选择了索引)。
我想知道这是否是我应该期望在实时和空闲数据库之间的那种差异,以及我是否正在接近为我的工作负载正确创建索引(这肯定是写得很重)或者总的来说。
其他一些细节: