知识卡片

位图索引/R树索引/倒排索引的适用场景对比

结构图卡

内容

除了通用的B树和哈希索引,还有三种为特定数据形态量身定制的索引结构, 各自解决的是B树/哈希索引不擅长的问题。位图索引用一串二进制位表示 “哪些记录取某个特定值”(每个可能取值对应一个位图,第i位为1表示第i条 记录取这个值),代价是空间极小(百万条记录的一个位图仅占约122KB) 且增删改查都能用位运算完成、速度很快,但它只适合取值种类少、重复率 高的字段(如性别、地区)——取值种类一多,位图数量跟着暴增,查询 效率反而下降;同时因为每次数据修改都要更新对应位图,它不适合频繁 写入的场景。R树是B树在高维/空间数据上的扩展,用最小外接矩形(MBR) 逐层框定空间范围,节点越往上框住的空间越大——本质上和B树一样是 “先粗筛大范围、再逐层精确定位”,只是把B树里”关键字区间”的概念换成 了”空间矩形区域”,主要用于地理信息系统这类需要按空间位置查询的场景, 增删改查操作的思路与B树完全类似。倒排索引和一般索引的存储方向正好 相反:一般索引存”关键字→数据位置指针”,倒排索引存”数据值→包含该值 的文档/记录位置列表”,天然适合全文检索场景(如Lucene的实现)—— 给定一个查询词,直接查倒排表就能拿到所有包含这个词的文档,不需要 像一般索引那样先确定要查哪个字段再定位关键字。三者的选型逻辑是: 取值集中且读多写少选位图索引,空间/多维数据选R树索引,全文检索选 倒排索引。

结构图

flowchart TD
    A[特殊场景索引选型] --> B{数据特征}
    B -->|取值种类少+重复率高+读多写少| C[位图索引<br/>每位代表一条记录,位运算高效]
    B -->|空间/多维数据| D[R树索引<br/>B树的空间扩展,用最小外接矩形逐层框定]
    B -->|全文检索场景| E[倒排索引<br/>存'数据值→文档位置列表'而非'关键字→数据指针']

参考来源

- 位置:《数据库原理(微课版)》第9章《数据库存储与索引》9.2.5节"其他 索引"(源文件:_epub-src/index_split_006.html) - 结论依据:原文明确"位图索引……它仅适用于重复值较多的字段,索引项 过多的情况下查询效率同样不高……适用于数据修改较少的场景……R树是 B树在高维空间的扩展……运用了空间分割的理念,采用最小外接矩形…… 倒排索引……与一般索引是相对的。一般索引存储的是关键字和指向数据 位置的指针……倒排索引存储的是数据值与指向数据位置的指针",因此 可以推出三种索引各自的适用场景与结构差异。 - 原始内容:位图索引……仅适用于重复值较多的字段……适用于数据修改 较少的场景……R树是B树在高维空间的扩展……倒排索引……一般索引存储 的是关键字和指向数据位置的指针……倒排索引存储的是数据值与指向 数据位置的指针。