我的相關部分的數據庫模式是有一個名爲User的表,它有一個布爾型字段Admin。該字段管理員有一個索引。我的Postgres數據庫沒有使用我的索引;我解決了它,但不明白修復,任何人都可以解釋發生了什麼?
將我的完整生產數據庫恢復到我的開發機器之前的一天,然後對數據庫做了很小的修改,所以它們應該非常相似。
當我跑我的開發機器上運行以下命令,我得到了預期的結果:
EXPLAIN SELECT * FROM user WHERE admin IS TRUE;
Index Scan using index_user_on_admin on user (cost=0.00..9.14 rows=165 width=3658)
Index Cond: (admin = true)
Filter: (admin IS TRUE)
然而,當我跑我的生產機器上完全相同的命令,我得到這個:
Seq Scan on user (cost=0.00..620794.93 rows=4966489 width=3871)
Filter: (admin IS TRUE)
因此,不是使用完全匹配查詢的確切索引,而是使用了近500萬行的順序掃描!
然後我試圖運行EXPLAIN ANALYZE SELECT * FROM user WHERE admin IS TRUE;
,希望ANALYZE
會使Postgres實現500萬行的順序掃描不如使用索引,但這並沒有改變任何東西。
我也嘗試運行REINDEX INDEX index_user_on_admin
以防索引損壞,沒有任何好處。
最後,我打電話給VACUUM ANALYZE user
,並在短期內解決了這個問題。
我對真空的主要理解是,它被用來回收浪費的空間。可能發生的事情會導致我的索引變得糟糕,爲什麼真空會修復它?
感謝您的鏈接,關於爲什麼我的電話分析查詢不足的任何想法? –
實際上'ANALYZE'糾正了這個問題。 '真空分析'碰巧做到了這兩點。另外注意,'EXPLAIN ANALYSE'不會對EXPLAIN所做的任何表進行任何分析。它所做的是運行查詢並與成本估算進行比較。 –