如何加快对具有180M条记录的表的查询?

时间:2018-07-28 21:35:35

标签: postgresql

我有大量数据,大约有1.8亿条记录,并且还在不断增长。

我的问题是,您建议做什么以进一步加快查询速度?

explain analyze
SELECT valtr_id,block_num,bnumvt,from_id,to_id,from_balance::text,to_balance::text,value,kind,tx_id,error
FROM value_transfer
WHERE from_id=19920723
ORDER BY bnumvt DESC LIMIT 20


 Limit  (cost=0.57..275.79 rows=20 width=69) (actual time=138197.769..138198.447 rows=20 loops=1)
   ->  Index Scan Backward using bnumvt_idx on value_transfer  (cost=0.57..216277802.83 rows=15716575 width=69) (actual time=138197.765..138198.437 rows=20 loops=1)
         Filter: (from_id = 19920723)
         Rows Removed by Filter: 58980120
 Planning time: 2.188 ms
 Execution time: 138198.618 ms
(6 rows)

postgres=> select count(*) from value_transfer where from_id=19920723;
  count   
----------
 15584518
(1 row)

postgres=> select count(*) from value_transfer;
   count   
-----------
 179685101
(1 row)
> 

postgres=> SELECT * FROM pg_indexes WHERE tablename = 'value_transfer';
 schemaname |   tablename    |      indexname      | tablespace |                                        indexdef                                         
------------+----------------+---------------------+------------+-----------------------------------------------------------------------------------------
 public     | value_transfer | value_transfer_pkey |            | CREATE UNIQUE INDEX value_transfer_pkey ON public.value_transfer USING btree (valtr_id)
 public     | value_transfer | bnumvt_idx          |            | CREATE UNIQUE INDEX bnumvt_idx ON public.value_transfer USING btree (bnumvt)
 public     | value_transfer | vt_block_id_idx     |            | CREATE INDEX vt_block_id_idx ON public.value_transfer USING btree (block_id)
 public     | value_transfer | vt_block_num_idx    |            | CREATE INDEX vt_block_num_idx ON public.value_transfer USING btree (block_num)
 public     | value_transfer | vt_from_id_idx      |            | CREATE INDEX vt_from_id_idx ON public.value_transfer USING btree (from_id)
 public     | value_transfer | vt_to_id_idx        |            | CREATE INDEX vt_to_id_idx ON public.value_transfer USING btree (to_id)
 public     | value_transfer | vt_tx_from_idx      |            | CREATE INDEX vt_tx_from_idx ON public.value_transfer USING btree (tx_id)
(7 rows)


CREATE TABLE value_transfer (
        valtr_id                        BIGSERIAL               PRIMARY KEY,
        tx_id                           BIGINT                  REFERENCES transaction(tx_id) ON DELETE CASCADE ON UPDATE CASCADE,
        bnumvt                          BIGINT                          NOT NULL,
        block_id                        INT                             REFERENCES block(block_id) ON DELETE CASCADE ON UPDATE CASCADE,
        block_num                       INT                             NOT NULL,
        from_id                         INT                             NOT NULL,
        to_id                           INT                             NOT NULL,
        value                           NUMERIC                 DEFAULT 0,
        from_balance            NUMERIC                 DEFAULT 0,
        to_balance                      NUMERIC                 DEFAULT 0,
        kind                            CHAR                    NOT NULL,
        depth                           INT                             DEFAULT 0,
        error                           TEXT                    NOT NULL
);

1 个答案:

答案 0 :(得分:1)

创建与查询的搜索和排序相匹配的索引将加快搜索速度:

CREATE INDEX vt_from_id_ bnumvt_idx 
  ON public.value_transfer 
  USING btree (from_id, bnumvt desc);