我正在 ubuntu 12.04 上构建一个大型 postgres 9.1 数据库,其中一个表包含大约 8000 万行左右。每当我运行 SELECT 语句时:
SELECT * FROM db WHERE ID=1;
执行只返回几千行的查询大约需要 2.5 分钟。在磁盘 I/O 上运行一些诊断程序后,我认为这不是问题,但以防万一下面是诊断程序的输出。(我有 2GB 的 RAM)我不太确定这里有什么好的输出,但考虑到互联网上其他服务器的统计数据,这似乎是一个大概。
time sh -c "dd if=/dev/zero of=bigfile bs=8k count=500000 && sync"
500000+0 records in
500000+0 records out
4096000000 bytes (4.1 GB) copied, 106.969 s, 38.3 MB/s
real 1m49.091s
user 0m0.248s
sys 0m9.369s
我对 postgresql.conf 进行了相当大的修改,将有效缓存提高到 75% 的内存,将 shared_buffers 提高到 25%,将 checkpoint_segments 提高到 15,work_mem 提高到 256MB,autovacuum,内核上的 SHMMAX 等等。我有一些性能提升,但不超过好 5%。网络不应该是一个问题,因为即使在 localhost 上运行它仍然需要很长时间。我计划添加更多数据,查询时间似乎随着行数的增加而快速增长。
看来我应该能够在几秒钟内运行这些 SELECT 语句,而不是几分钟。关于这个瓶颈可能在哪里的任何建议?