Spanner复合主键单字段查询行为差异原因咨询
为什么Spanner复合主键表查询不同主键字段的性能差异这么大?
这其实是由Spanner(以及大多数分布式数据库)中复合主键的索引存储结构决定的,咱们一步步拆解清楚:
复合主键的有序存储逻辑
Spanner的复合主键是按前缀优先的有序方式来存储数据的。比如你的表主键是(ColA, ColB),所有数据会先按ColA的值排序,当ColA相同时,再按ColB排序。这种结构下,所有ColA = 'dfdf'的行在存储上是连续的一块,数据库可以直接定位到这个区块,只扫描这部分数据就行,所以查询速度快,耗时仅10ms。为什么查询ColB会触发全表扫描
复合索引的核心是前缀匹配,ColB作为主键的后缀字段,它的值是依附于ColA存在的。不同的ColA下都可能有相同的ColB值,这些行在存储上是分散在不同的ColA区块里的,没有连续的存储区间可以直接定位。数据库没办法通过ColB的值快速找到对应的行,只能遍历整个表的所有行逐一检查,这就导致了全表扫描。关于“逻辑不统一”的误解
这可不是逻辑不统一,而是复合索引的设计特性。所有基于有序索引(比如B树类索引)的数据库都遵循这个规则:只有使用复合索引的前缀字段(比如单独用ColA,或者同时用ColA+ColB),才能利用索引加速查询;如果跳过前缀直接查询后缀字段,索引完全发挥不了作用,只能走全表扫描。
如果想优化ColB的查询性能,你可以给ColB单独创建一个二级索引,这样后续查询ColB = 'dfdf'时,就能通过这个二级索引快速定位目标行,避免全表扫描了。
内容的提问来源于stack exchange,提问作者Naresh Nagarajan
相关产品推荐
相关产品推荐

