2013-01-20 27 views
3

我有以下查詢:瞭解如何通過PostgreSQL優化查詢/導軌解釋數據

c = Invite.where(:invite_method => 'email', :email => email, :created_at => Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).count 

該查詢正在爲表中有超過100萬的記錄一段時間。這裏是查詢輸出:

> invites_sent_today = Invite.where(:invite_method => 'email', :email => email, :created_at => Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).exp 

Invite Load (62.3ms) SELECT "invites".* FROM "invites" WHERE "invites"."invite_method" = 'email' AND "invites"."email" = '[email protected]' AND ("invites"."created_at" BETWEEN '2013-01-20 00:00:00.000000' AND '2013-01-20 23:59:59.999999') 

EXPLAIN (2.2ms) EXPLAIN SELECT "invites".* FROM "invites" WHERE "invites"."invite_method" = 'email' AND "invites"."email" = '[email protected]' AND ("invites"."created_at" BETWEEN '2013-01-20 00:00:00.000000' AND '2013-01-20 23:59:59.999999') 

=> EXPLAIN for: 

SELECT \"invites\".* 
    FROM \"invites\" 
WHERE \"invites\".\"invite_method\" = 'email' 
    AND \"invites\".\"email\" = '[email protected]' 
    AND (\"invites\".\"created_at\" 
    BETWEEN '2013-01-2000:00:00.000000'                
     AND'2013-01-20 23:59:59.999999' 
     ; 

QUERY PLAN\n------------------------------------------------------------------------------------------------------------------------------------------------------------------\n 
Index Scan using index_invites_on_created_at on invites (cost=0.00..17998.11 rows=2 width=129)\n 
Index Cond: ((created_at >= '2013-01-20 00:00:00'::timestamp without time zone) AND (created_at <= '2013-01-20 23:59:59.999999'::timestamp without time zone))\n 
Filter: (((invite_method)::text = 'email'::text) AND ((email)::text = '[email protected]'::text))\n(3 rows)\n" 

有關如何可能提高此查詢性能的任何建議?感謝

+1

複合或局部索引可以加快該特定查詢。 –

+0

@IgorRomanchenko謝謝,你能分享一個例子嗎? – AnApprentice

+1

示例:'CREATE INDEX zzzzz ON邀請(email)WHERE invite_method ='email''順便說一句:檢查queryplan的方法是運行EXPLAIN ANALYSE查詢語句,並查看觀察和預期之間的差異。 – wildplasser

回答

0

如所建議的由伊戈爾,嘗試複合索引:

CREATE INDEX index_invites_email_created_at on invites(email,created_at);