知识卡片
连接索引对多列查询的排序局限催生专门的多维索引
内容
标准的B树或LSM树索引本质上只把一个键映射到一个值,如果需要同时查询多个列,最常见 的做法是连接索引:把多个字段的值依次拼接成一个组合键(像老式电话簿从”姓+名”查 电话号码那样)。这种索引能高效支持”查所有特定姓氏的人”或”查特定姓+名组合的人”, 但完全没法用来”查所有特定名字的人”——因为索引的排序顺序是先按姓、再按名,名字 在排序里处于次要位置,脱离姓氏单独按名查找无法利用这个索引的有序性。这个局限 在处理真正的多维查询(如地理经纬度范围查询:查某个矩形区域内的所有餐厅)时会 彻底失效:一个标准B树或LSM树索引只能高效返回某个维度范围内的所有记录(比如纬度 范围),但另一个维度(经度)在这个结果集里几乎是任意分布的,无法同时满足两个 维度的范围约束。解法是专门的多维索引结构,如把二维位置通过空间填充曲线转换成 单个数字再用常规B树索引,或者用专门的空间索引结构(如R树,PostGIS就是基于 PostgreSQL的GiST工具把地理空间索引实现成R树)。这个思路不局限于地理数据—— 电商网站可以在颜色的RGB三个维度上建索引来搜索特定颜色范围的商品,气象数据库可以 在(日期,温度)两个维度上建索引来高效查询”2013年温度在25-30°C之间的观测记录”, 而不必先扫描全年记录再按温度过滤(或反过来)。
参考来源
- 位置:《数据密集型应用系统设计》第三章《存储与检索》"多列索引"(源文件:
_epub-src/ch3_split_002.html)
- 结论依据:原文说明连接索引组合多列成一个键,能支持按姓氏或姓名组合查询但无法
单独按名字查询,标准B树/LSM树索引无法同时满足二维范围查询,因此需要空间填充
曲线或R树这类多维索引结构,并举出颜色和天气观测的多维索引例子,直接支撑本卡片
结论。
- 原始内容:最常见的多列索引被称为连接索引……然而,如果你想找到所有具有特定名字
的人,这个索引是没有用的……一个标准的B树或者LSM树索引不能够高效地响应这种查询
……一种选择是使用空间填充曲线将二维位置转换成单个数字……更普遍的是,使用特殊化
的空间索引,例如R树。