WHERE 決定回傳幾列,索引才決定要看過幾列

WHERE project_id = X 決定的是回傳多少列(也就是分成幾頁)。它沒有減少資料庫要看過多少列。

沒有索引時,資料庫不知道哪些列屬於這個專案,只能整張表逐筆檢查、逐筆比對 project_id——這是 full table scan。條件再精準,掃描量仍然是整張表。

索引才是那個「不用看過全部」的機制:它讓資料庫直接定位到 project_id = X 的那一段,掃描量從表的大小降成符合條件的列數。

讀 query 時要分開的兩個量

量由什麼決定影響
回傳幾列(rows returned)WHERE / LIMIT網路傳輸、記憶體
看過幾列(rows examined)索引資料庫的實際工作量

效能問題幾乎都出在第二個量。「我有加 WHERE 啊」不是效能論證——要看執行計畫確認它真的走了索引。

這兩個量在執行計畫裡是分開印的

不用推論,直接看得到:

Seq Scan on orders  (actual time=0.031..412.775 rows=87432 loops=1)
  Filter: (status = 'pending')
  Rows Removed by Filter: 712568
輸出對應上表哪一列
rows=87432回傳幾列
Rows Removed by Filter: 712568讀了但丟掉的 → 加起來 80 萬列是「看過幾列」

讀了 80 萬、留下 8 萬。 Rows Removed by Filter 愈大,代表這個條件愈值得有索引來幫它跳過。怎麼讀整份輸出見 執行計畫是一棵樹,從下往上讀。

相關:JOIN 貴在每一列都要去另一張表配對