分区表的索引实际上包含本地索引和全局索引两种类型,两者结构不同、适用场景也不同。
分区表索引的两种类型
本地索引(Local Index)
- 结构 :每个分区各自维护一棵独立的索引树,父表本身没有索引
- 本质:N 个分区 = N 棵独立的索引树
- 查询时:必须先通过分区裁剪定位到具体分区,再在该分区的索引中查找
全局索引(Global Index)
- 结构 :整个父表共享一棵索引树,所有分区的数据都挂在这棵树上
- 本质:不管有多少个分区,索引只有一棵
- 查询时:直接走这棵全局索引树,无需关心数据在哪个分区
结构对比图解
本地索引(每个分区独立一棵树):
父表 orders
├── 分区 p202401 → 索引树 [order_date索引]
├── 分区 p202402 → 索引树 [order_date索引]
└── 分区 p202403 → 索引树 [order_date索引]
全局索引(所有分区共享一棵树):
父表 orders
├── 分区 p202401 ─┐
├── 分区 p202402 ─┼──→ 一棵全局索引树 [order_id索引]
└── 分区 p202403 ─┘
关键区别
| 维度 | 本地索引 | 全局索引 |
|---|---|---|
| 索引数量 | 每个分区各一棵 | 整个表只有一棵 |
| 查询是否必须带分区键 | 是,否则无法裁剪分区 | 否,任意字段都能高效查 |
| 增删分区时 | 只影响对应分区,零额外开销 | 可能导致整棵索引失效需重建 |
| 典型场景 | 按时间/地区等分区键过滤 | 按非分区键(如订单号)点查 |
一句话总结
本地索引是"每个分区各管各的索引",全局索引是"所有分区共用一棵索引树"。分区表的索引策略通常是两者结合使用,而不是只选其中一种。