我在Google Cloud Spanner中有一个8.6亿行的表,我试图了解解释的工作原理。
该表有一个字符串列geoid
,并且此列有一个索引。
当我运行以下查询时,只需要36毫秒
SELECT count(*)
FROM usbg_2015
WHERE geoid= '340170175001'
表结构为:
CREATE TABLE usbg_2015 (
geoid STRING(12),
quadkey STRING(24),
) PRIMARY KEY (geoid, quadkey)
但是,我不明白为什么解释说它使用Table Scan而不是Index Scan。我将Table scan理解为对表的完整扫描,在这种情况下,读取860M行,它需要的时间超过36ms。我缺少什么?
在说明中,表扫描仅表示它从表中读取数据,并不一定表示全表扫描。索引扫描也是如此。这意味着它正在从索引中读取。在这两种情况下,如果都有可搜索的谓词(例如,主键或索引列上的常量前缀),它们将进行搜索。
该计划使用了基表,并搜索并扫描了11行,否则您将看到从表扫描中返回了860M行。
大地水准面是表usbg_2015的前导主键列吗?这是给定计划我唯一能想到的解释。