表格
Table "public.hugetable"
Column | Type | Modifiers | Storage | Description
---------+-----------------------+-----------+----------+-------------
reqid | character varying(15) | | extended |
browser | character varying(15) | | extended |
a | smallint | | plain |
b | smallint | | plain |
metarr | smallint[] | | extended |
行数:8000万
索引:无
解释:
testdb=> EXPLAIN (ANALYZE,BUFFERS) select b from hugetable;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Seq Scan on hugetable (cost=0.00..6514286.08 rows=80000008 width=2) (actual time=0.009..598004.456 rows=80000000 loops=1)
Buffers: shared hit=472831 read=5241455
Total runtime: 674134.766 ms
metarr smallint[]
包含250个元素。
查询与select b from hugetable where a=someval
或select metric[199] from hugetable
服务器规格:
db.m3.xlarge
Type:Type Standard - Current Generation
vCPU:Number of virtual cores 4 vCPU
Memory: 15 GiB
我从未使用过如此庞大的数据集,所以我不确定此类查询的10分钟是否正常。
实际上,会有另一列(日期时间)。该表将在1整天内包含约8000万条记录,查询将始终为SELECT metarr[someindex] from hugetable where datetimecolumn > something and datetimecolumn <something
。
我可以做些什么来加快速度?似乎一旦我在一段时间内添加了一个datetime列和查询,它仍然会花费大量的时间!
答案 0 :(得分:0)
磁盘上的表大于RAM。因此,表不能完全缓存在RAM中。增加RAM大小以适合您的工作集。这将删除所有IO。
仅索引您需要的列。这样PostgreSQL就可以执行仅索引扫描并扫描更少的数据。这减少了工作集。
现在,您可能会在数据库和应用程序之间的网络上遇到瓶颈。
答案 1 :(得分:0)
如何提高数据库查询性能
索引用于比较的列(例如:日期列应在两个示例中编入索引)
SELECT * FROM X WHERE X.date = 2014
或
SELECT * FROM X INNER JOIN Y ON X.date = Y.date
水平分区(分片)将表格分成几个块(例如:每日轮换)并将每个块放在不同的机器上。
通过在多台计算机上复制数据库分区来复制数据库。除非你有不同标准的并发查询
使用高IOPS SSD驱动器(AWS称之为配置IO)。
对于日期使用datetime类型,它具有比int更好的性能 http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/
使用memcached,redis,.. etc来缓存结果,以便更快地检索(如果同一个查询将多次运行)