选择8000万行需要太长时间

时间:2014-10-09 13:12:39

标签: performance postgresql postgresql-performance

表格

                       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=somevalselect 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列和查询,它仍然会花费大量的时间!

2 个答案:

答案 0 :(得分:0)

磁盘上的表大于RAM。因此,表不能完全缓存在RAM中。增加RAM大小以适合您的工作集。这将删除所有IO。

仅索引您需要的列。这样PostgreSQL就可以执行仅索引扫描并扫描更少的数据。这减少了工作集。

现在,您可能会在数据库和应用程序之间的网络上遇到瓶颈。

答案 1 :(得分:0)

如何提高数据库查询性能

  1. 索引用于比较的列(例如:日期列应在两个示例中编入索引)

    SELECT * FROM X WHERE X.date = 2014
    

    SELECT * FROM X INNER JOIN Y ON X.date = Y.date
    
  2. 水平分区(分片)将表格分成几个块(例如:每日轮换)并将每个块放在不同的机器上。

  3. 通过在多台计算机上复制数据库分区来复制数据库。除非你有不同标准的并发查询

  4. ,否则这对你的情况不会有太大帮助
  5. 使用高IOPS SSD驱动器(AWS称之为配置IO)。

  6. 对于日期使用datetime类型,它具有比int更好的性能 http://gpshumano.blogs.dri.pt/2009/07/06/mysql-datetime-vs-timestamp-vs-int-performance-and-benchmarking-with-myisam/

  7. 使用memcached,redis,.. etc来缓存结果,以便更快地检索(如果同一个查询将多次运行)