今天我遇到了一個奇怪的問題。我在postgres(表T)中有一個大表,它有很多列(col1..col100),我有索引I1(col2,col3,col4)。Postgtres查詢未使用索引列索引
現在
explain select col2,col3 from T;
顯示SEQ掃描的表,而不是使用索引。我認爲它應該像索引只掃描,因爲我們正在選擇索引中的列。
可能是什麼原因?
今天我遇到了一個奇怪的問題。我在postgres(表T)中有一個大表,它有很多列(col1..col100),我有索引I1(col2,col3,col4)。Postgtres查詢未使用索引列索引
現在
explain select col2,col3 from T;
顯示SEQ掃描的表,而不是使用索引。我認爲它應該像索引只掃描,因爲我們正在選擇索引中的列。
可能是什麼原因?
首先閱讀並分析。我認爲這可能會有所幫助。
https://robots.thoughtbot.com/why-postgres-wont-always-use-an-index
如果SELECT返回比約5-10%以上(取決於配置設置和數據的存儲。這不是一個很難數)的所有行的表中,按順序進行掃描比索引掃描快得多。
索引掃描對每一行都需要多個IO操作(查找索引中的行,然後從堆中檢索行)。順序掃描對每一行只需要一個IO,甚至更少,因爲磁盤上的塊(頁面)包含多個行,因此可以通過單個IO操作獲取多行。
對於其他DBMS也是如此 - 一些優化被視爲「僅索引掃描」(但對於SELECT *,這是非常不可能的,這樣的DBMS將用於「僅索引掃描」)