Cloud Spanner复合主键场景下仅用id单查的查询效率疑问
Cloud Spanner 复合主键前缀匹配的查询效率问题
我正在用Cloud Spanner搭建一个Imgur克隆项目,设计的Images表结构如下:
CREATE TABLE Images (id STRING(36) NOT NULL, createdAt TIMESTAMP, caption STRING(1024), fileType STRING(10)) PRIMARY KEY (id, createdAt DESC)
这里id用的是GCP文档推荐的版本4 UUID,用来避免热点问题;createdAt是图片首次创建的时间戳。把主键设为(id, createdAt DESC)是为了方便查询最新添加的图片。
我的疑问是:如果只用SELECT * FROM Images WHERE id = 'some UUID'查询单张图片,虽然只指定了主键的一部分,Spanner能不能通过键高效查询——也就是直接从存储该特定键范围的服务器获取数据?
这种查询是完全高效的,原因如下:
- Cloud Spanner的分片策略基于主键范围,复合主键的第一部分
id作为前缀,当你指定id = '某个UUID'时,Spanner可以直接定位到存储该id前缀对应主键范围的节点,不需要做全表扫描或跨节点查询。 - 复合主键的前缀匹配属于键值查询范畴,Spanner会利用主键索引直接定位目标数据,效率和指定完整主键的查询几乎没有差别。
- 你用版本4 UUID作为
id,每个id理论上唯一,所以这个查询本质就是精准定位单条记录,Spanner会直接找到存储该记录的节点并返回数据,性能拉满。
内容的提问来源于stack exchange,提问作者cristian.petroaca
相关产品推荐
相关产品推荐

