當資料表變大時,沒有索引的查詢可能需要掃描整張表,效能急遽下降。索引是加速查詢的重要機制,但並非沒有成本。理解其原理有助於正確設計與維護資料庫。
索引類似書籍的目錄。它維護某個欄位(或欄位組合)的排序結構,並指向實際資料列的位置。查詢條件如果能利用索引,資料庫就可以快速定位符合的列,而不必逐行檢查。最常見的結構是 B-tree(或其變體),適合等值與範圍查詢。
主鍵通常自動帶有索引。外鍵、經常出現在 WHERE、JOIN、ORDER BY 的欄位也常是索引候選。
因此索引不是越多越好。應針對實際查詢模式建立,並定期檢視使用情況。
對欄位使用函數或隱式型別轉換,可能導致索引失效。例如 WHERE YEAR(date_col) = 2026 往往無法直接使用 date_col 的索引。LIKE 以萬用字元開頭也通常無法利用一般 B-tree 索引。
覆蓋索引(查詢所需欄位都在索引中)可以避免回表,進一步提升效能。部分資料庫支援部分索引、表達式索引或全文索引,適用特定場景。
應用層的快取可以減少資料庫負載,但無法取代正確的索引設計。ORM 產生的查詢有時不夠理想,必要時應檢視實際 SQL。分頁、大量匯出等操作也要注意是否造成全表掃描或深層分頁問題。
理解索引是後端與資料庫管理的核心技能。本地開發時可以用小型資料集實驗 EXPLAIN 的輸出差異。Wusper 的開發相關工具雖不直接操作資料庫,但相關概念(雜湊、編碼、查詢字串等)在建構資料驅動應用時經常一起出現。
本文為概念性說明。不同資料庫系統(PostgreSQL、MySQL、SQLite 等)的索引實作與最佳實務略有差異,實際優化時應參考該系統的文件。