我正在开发一个有aprox表格的系统。 1300万条记录。 对于postgres而言,这似乎并不是什么大不了的事,但是当我遇到这个特定的表时,我面临严重的性能问题。
该表有aprox。 60列(我知道它太多了,但我不能因为我的意愿而改变它。)
硬件不是问题。它正在AWS上运行。我测试了几种配置,甚至是postgres的新RDS:
vCPU ECU mem(gb)
m1.xlarge 64 bits 4 8 15
m2.xlarge 64 bits 2 6,5 17
hs1.8xlarge 64 bits 16 35 117 SSD
我用pgtune调整了pg设置。还设置了ubuntu的内核sshmall和shmmax。
一些“解释分析”查询:
从:
中选择count(*)$Aggregate (cost=350390.93..350390.94 rows=1 width=0) (actual time=24864.287..24864.288 rows=1 loops=1)
-> Index Only Scan using core_eleitor_sexo on core_eleitor (cost=0.00..319722.17 rows=12267505 width=0) (actual time=0.019..12805.292 rows=12267505 loops=1)
Heap Fetches: 9676
Total runtime: 24864.325 ms
从以下选择不同的core_eleitor_city:
HashAggregate (cost=159341.37..159341.39 rows=2 width=516) (actual time=15965.740..15966.090 rows=329 loops=1)
-> Bitmap Heap Scan on core_eleitor (cost=1433.53..159188.03 rows=61338 width=516) (actual time=956.590..9021.457 rows=5886110 loops=1)
Recheck Cond: ((core_eleitor_city)::text = 'RIO DE JANEIRO'::text)
-> Bitmap Index Scan on core_eleitor_city (cost=0.00..1418.19 rows=61338 width=0) (actual time=827.473..827.473 rows=5886110 loops=1)
Index Cond: ((core_eleitor_city)::text = 'RIO DE JANEIRO'::text)
Total runtime: 15977.460 ms
我在经常用于过滤或聚合的列上有btree索引。
所以,鉴于我无法改变我的桌面设计。我能做些什么来提高性能吗?
任何帮助都会很棒。
由于
答案 0 :(得分:1)
你在VPS集群上聚合~12.3M和~5.9M行,如果我没有误会,可能会跨越多个物理服务器,数据可能是从另一组不同服务器上的SAN中提取的。 Postgres本身。
Imho,除了a)没有运行基本上访问整个数据库表的查询以及b)如果可能的话,使用触发器保持预计数,你几乎无法做到更快(AWS无论如何)。坚持这样做。答案 1 :(得分:1)
在这里,您可以提高RDS的性能:
如上所述链接:
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html
Amazon RDS使用MySQL的内置复制功能从源数据库实例创建一种称为只读副本的特殊类型的数据库实例。对源数据库实例所做的更新将复制到只读副本。您可以通过将读取查询从应用程序路由到只读副本来减少源数据库实例的负载。对于读取繁重的数据库工作负载,只读副本允许您弹性扩展超出单个数据库实例的容量限制。