4

我有一个生产数据库,它使用 londist 复制到另一台主机。桌子看起来像

# \d+ usermessage
               Table "public.usermessage"
  Column       |       Type        | Modifiers | Description
-------------------+-------------------+-----------+-------------
 id                | bigint            | not null  |
 subject           | character varying |           |
 message           | character varying |           |
 read              | boolean           |           |
 timestamp         | bigint            |           |
 owner             | bigint            |           |
 sender            | bigint            |           |
 recipient         | bigint            |           |
 dao_created       | bigint            |           |
 dao_updated       | bigint            |           |
 type              | integer           |           |
 replymessageid    | character varying |           |
 originalmessageid | character varying |           |
 replied           | boolean           |           |
 mheader           | boolean           |           |
 mbody             | boolean           |           |
Indexes:
"usermessage_pkey" PRIMARY KEY, btree (id)
"usermessage_owner_key" btree (owner)
"usermessage_recipient_key" btree (recipient)
"usermessage_timestamp_key" btree ("timestamp")
"usermessage_type_key" btree (type)
Has OIDs: no

如果在复制的数据库上执行,则选择速度如预期的那样快,如果在生产主机上执行,则速度非常慢。更奇怪的是,并非所有时间戳都很慢,其中一些在两台主机上都很快。生产主机后面的文件系统和存储都很好,并且没有被大量使用。有任何想法吗?

replication# explain analyse SELECT COUNT(id) FROM usermessage WHERE owner = 1234567 AND timestamp > 1362077127010;
                                                                 QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=263.37..263.38 rows=1 width=8) (actual time=0.059..0.060 rows=1 loops=1)
   ->  Bitmap Heap Scan on usermessage  (cost=259.35..263.36 rows=1 width=8) (actual time=0.055..0.055 rows=0 loops=1)
         Recheck Cond: ((owner = 1234567) AND ("timestamp" > 1362077127010::bigint))
         ->  BitmapAnd  (cost=259.35..259.35 rows=1 width=0) (actual time=0.054..0.054 rows=0 loops=1)
               ->  Bitmap Index Scan on usermessage_owner_key  (cost=0.00..19.27 rows=241 width=0) (actual time=0.032..0.032 rows=33 loops=1)
                     Index Cond: (owner = 1234567)
               ->  Bitmap Index Scan on usermessage_timestamp_key  (cost=0.00..239.82 rows=12048 width=0) (actual time=0.013..0.013 rows=0 loops=1)
                     Index Cond: ("timestamp" > 1362077127010::bigint)
 Total runtime: 0.103 ms
(9 rows)

production#  explain analyse SELECT COUNT(id) FROM usermessage WHERE owner = 1234567 AND timestamp > 1362077127010;
                                                                        QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=267.39..267.40 rows=1 width=8) (actual time=47536.590..47536.590 rows=1 loops=1)
   ->  Bitmap Heap Scan on usermessage  (cost=263.37..267.38 rows=1 width=8) (actual time=47532.520..47536.579 rows=3 loops=1)
         Recheck Cond: ((owner = 1234567) AND ("timestamp" > 1362077127010::bigint))
         ->  BitmapAnd  (cost=263.37..263.37 rows=1 width=0) (actual time=47532.334..47532.334 rows=0 loops=1)
               ->  Bitmap Index Scan on usermessage_owner_key  (cost=0.00..21.90 rows=168 width=0) (actual time=0.123..0.123 rows=46 loops=1)
                     Index Cond: (owner = 1234567)
               ->  Bitmap Index Scan on usermessage_timestamp_key  (cost=0.00..241.22 rows=12209 width=0) (actual time=47530.255..47530.255 rows=5255617 loops=1)
                     Index Cond: ("timestamp" > 1362077127010::bigint)
 Total runtime: 47536.668 ms
(9 rows)
4

1 回答 1

4

我对 postgresql 的熟悉不如 mysql 但是

(实际时间=0.013..0.013 行=0 循环=1)

(实际时间=47530.255..47530.255 行=5255617 循环=1)

向我建议您的生产数据库有更多数据,因为行是截然不同的。

于 2013-03-07T15:58:37.823 回答