內容已複查
25 分鐘 · 2 張概念卡 · 3 題對應考古題

資料庫儲存與索引:等值、範圍與分析查詢

本頁為依教材與考古題整理的原創摘要;考古題答案經技術覆核,但不是官方答案。

第一次接觸也沒關係

這堂先懂這些詞

先記住白話意思,不必急著背英文。看到正文時,再把正式名稱接回來。

資料庫索引

也會看到:index、B-tree、B+ tree、hash index、索引

建立額外查找結構,讓資料庫不必每次掃完整張表。

生活例子:
像書末索引讓你直接找到頁碼,不必從第一頁翻起。
別搞混:
索引會占空間並增加寫入維護成本,不是每個欄位都建越多越好。

雜湊碰撞

也會看到:hash collision、collision、雜湊衝突

不同輸入經雜湊後落到同一位置,需要額外規則分開保存。

生活例子:
兩位同姓客人被分到同一取餐代號,櫃台還要用其他資訊辨認。
別搞混:
碰撞是有限位置下的正常可能,不等於雜湊函式壞掉或被攻擊。

選擇率與查詢最佳化器

也會看到:selectivity、query optimizer、query plan

選擇率描述條件能縮小多少資料;最佳化器估算不同執行方式成本後選擇 query plan。

生活例子:
找唯一訂單編號比找『今年訂單』縮得更小,較可能適合精準索引。
別搞混:
有索引不代表一定使用;掃描大量資料時全表掃描可能更便宜。

資料倉儲與 OLAP

也會看到:data warehouse、OLAP、multidimensional analysis

資料倉儲整合歷史資料供分析;OLAP 從時間、地區、商品等多個維度快速彙總比較。

生活例子:
像主管用同一批銷售歷史,切換查看各月份、城市與品類。
別搞混:
OLAP 偏分析查詢,不等同處理日常逐筆訂單的 OLTP。

從 page I/O 與資料排列理解 heap file、B+ tree、hash index、多維分析結構及 optimizer 選擇,避免把所有索引都當成無條件加速器。

先抓住這幾件事

  • 說明索引以額外空間與維護成本換取讀取效率
  • 比較 B+ tree 與 hash index 的等值及範圍能力
  • 辨識 data warehouse/OLAP 與多維分析需求
  • 解釋 selectivity 與 query plan 為何影響索引使用

先想像這個場景

圖書館找書與月度分析

館員既要讓讀者用 ISBN 立刻找到一本書,也要查出版年份區間,月底還要分析各館別、月份與類別的借閱量。單一目錄結構不一定同時最佳。

先別急著往下看,花十秒想一想:

把 2020、2021、2022 經 hash 後放進不同櫃位,是否仍能從 2020 的櫃位一路掃到 2022?

把故事換成電腦語言

生活中的角色對應到技術概念
書架上的實體批次Database pages 與 page I/O
依 ISBN 直接查櫃位Equality lookup 與 hash index
沿年份排序目錄查一段區間B+ tree leaf range scan
依月份、館別、類別切換報表OLAP dimensions 與 measures
人太多時乾脆順著整排巡一次Optimizer 選 sequential scan

題目出現這些字,先想到

  • 看到 range query:優先想到保留排序且葉節點相連的 B+ tree。
  • 看到 hash 不適合 range:理由是破壞 ordering,不是單純 storage 較大。
  • 看到 warehouse、OLAP、slice/dice:辨識 multidimensional analysis。
  • 看到『有 index 為何沒用』:檢查 selectivity、回表與 page I/O 成本。

1.資料庫成本常由 page I/O 主導

Records 儲存在 pages;heap file 不維持 key 順序,插入通常直接,但搜尋可能掃描多頁。Index 保存 search key 到 record/page 的導引,讓查詢少讀 pages,代價是額外空間與 INSERT/UPDATE/DELETE 維護。

  • Index 不是資料本身的免費副本
  • Sequential scan 對大量結果可能更划算
  • 更多 indexes 會增加寫入成本
  • Physical design 取決於 workload

2.B+ tree 保留排序,適合 range scan

B+ tree 是高扇出的平衡搜尋樹,內部節點導引搜尋,葉節點依 key 排序並通常相連。等值查詢可沿 root-to-leaf,範圍查詢找到起點後沿葉節點順序掃描。

  • 所有資料 entries 位於葉層
  • 樹高通常很低
  • 葉節點排序支援 BETWEEN、<、>
  • 平衡性讓搜尋成本穩定

3.Hash index 擅長 equality,會破壞順序

Hash function 將相近 key 映射到可能完全不同 buckets,因此 `key = value` 可直接定位候選 bucket,但 `20 <= key <= 30` 沒有連續路徑可循。碰撞策略仍會影響等值查詢成本。

  • Equality predicate 是 hash index 強項
  • Range predicate 通常不是
  • Hash collision 不等於查不到資料
  • Hash index 不保留 key ordering

4.OLAP 與 optimizer 看的是整體工作負載

Data warehouse 常服務聚合、切片、鑽取等 OLAP 分析;多維資料庫或 cube 以 dimensions 與 measures 組織分析。Relational optimizer 會依符合比例、statistics、join cost 與預估 page I/O 選 scan 或 index,索引存在不代表一定使用。

  • Highly selective predicate 通常只讓少量 rows 符合;用符合比例描述可避免 high/low selectivity 的教材歧義
  • Statistics 過期可能選錯 plan
  • Covering index 可減少回表
  • OLTP 與 OLAP 的 workload 不同

一起拆題目

範例 1查詢 `age BETWEEN 20 AND 30`,B+ tree 與 hash index 何者較合適?

  1. 此條件需要 key order
  2. B+ tree 找到 20 後沿葉節點掃到 30
  3. Hash mapping 不保留 20 到 30 的連續關係

所以答案是:通常選 B+ tree;hash index 較適合 `age = 25`。

範例 2一個查詢會讀取全表 70% rows,optimizer 為何可能不用現有 index?

  1. 走 index 需讀大量 index entries
  2. 還可能對每筆回表造成隨機 I/O
  3. Sequential scan 可能以較少且連續的 page I/O 完成

所以答案是:索引不是必然較快;低選擇性的查詢可能以全表掃描成本更低。

這裡最容易選錯

  • 認為建 index 永遠加速所有操作
  • 說 hash index 能自然支援 range query
  • 把 B+ tree 與 binary tree 的扇出混為一談
  • 忽略寫入維護與額外空間
  • 認為 optimizer 一定使用已存在的 index

換你快速判斷

先在心中作答,再展開答案。答不出來時,回頭找本課的對照關係。

1B+ tree 為何適合 range query?

Keys 在葉節點保持排序且葉節點相連;找到範圍起點後可順序掃描到終點。

高扇出與平衡性也讓 root-to-leaf page I/O 維持低高度。

2Hash index 為何通常不適合 range query?

Hash function 破壞 key 的排序關係,相鄰值可能落到完全不同 buckets,無法沿連續位置掃描。

Hash index 通常適合 equality lookup,而非 BETWEEN、<、>。

最後用考古題驗證

本課連結的題目都已通過可重現的技術覆核,可逐題練習與判分。

開始本課考古題練習

參考來源