0
我運行簡單的查詢:的PostgreSQL和ActiveRecord的 - 慢查詢
History.where(channel_id: 1).order('histories.id DESC').first
結果:
History Load (808.8ms) SELECT "histories".* FROM "histories" WHERE "histories"."channel_id" = 1 ORDER BY histories.id DESC LIMIT 1 [["channel_id", 1]]
808.8ms 7 1的記錄與CHANNEL_ID = 1。總的歷史數爲2110443。
如果我選擇CHANNEL_ID所有歷史= 1:
History.where(channel_id: 1)
History Load (0.5ms) SELECT "histories".* FROM "histories" WHERE "histories"."channel_id" = 1 [["channel_id", 1]]
只花了0.5ms的
如果我們試圖採取一個紀錄紅寶石陣列的幫助:
History.where(channel_id: 1).order('histories.id DESC').to_a.first
History Load (0.5ms) SELECT "histories".* FROM "histories" WHERE "histories"."channel_id" = 1 ORDER BY id DESC [["channel_id", 1]]
我應該在哪裏找到問題?
PS:我已經有了channel_id字段的索引。
UPD:
History.where(channel_id: 1).order('histories.id DESC').limit(1).explain
History Load (848.9ms) SELECT "histories".* FROM "histories" WHERE "histories"."channel_id" = 1 ORDER BY histories.id DESC LIMIT 1 [["channel_id", 1]]
=> EXPLAIN for: SELECT "histories".* FROM "histories" WHERE "histories"."channel_id" = 1 ORDER BY histories.id DESC LIMIT 1 [["channel_id", 1]]
QUERY PLAN
-------------------------------------------------------------------------------------------------------
Limit (cost=0.43..13.52 rows=1 width=42)
-> Index Scan Backward using histories_pkey on histories (cost=0.43..76590.07 rows=5849 width=42)
Filter: (channel_id = 1)
(3 rows)
通常,'channel_id,id'複合索引應該有所幫助。如果你的用例是特殊的,即你只需要通道'1',你可以設置一個[部分索引](https://www.postgresql.org/docs/current/static/indexes-partial.html) 。 – pozs
@pozs謝謝你,通過複合索引'channel_id,id'解決 – zolter