Spanner中复合主键是否需单独创建索引?
Spanner复合主键索引相关问题解答
你的表DDL如下:
CREATE TABLE orders_pii( order_id STRING(64) NOT NULL, retailer_id STRING(64) NOT NULL, site_id STRING(64) NOT NULL, shipping_labels ARRAY<STRING(MAX)>, order_creation_timestamp TIMESTAMP NOT NULL, order_stage_by_timestamp TIMESTAMP NOT NULL, ) PRIMARY KEY(order_id, retailer_id, site_id)
根据你引用的Spanner文档描述:
Spanner会自动为每个表的主键创建索引。例如,您无需为主键执行任何索引操作
针对你的复合主键疑问,解答如下:
- Spanner会直接创建包含这三个列的复合主键索引,而非为三个列分别创建独立索引。这个索引的排序规则严格遵循主键列的定义顺序:先按
order_id排序,同order_id的行再按retailer_id排序,最后按site_id排序。 - 是否需要单独创建索引,完全取决于你的查询需求:
- 若你的查询条件总是能匹配复合主键的前缀(比如仅用
order_id过滤,或order_id+retailer_id组合过滤,或完整三个主键列过滤),默认的复合主键索引足以支撑查询,无需额外创建单列索引。 - 若存在仅基于
retailer_id或site_id的查询(不包含前面的主键前缀列),这类查询无法利用默认的复合索引,此时才需要为对应列创建二级索引。
- 若你的查询条件总是能匹配复合主键的前缀(比如仅用
内容的提问来源于stack exchange,提问作者Sid P Tkf
相关产品推荐
相关产品推荐

