低基数列的B-Tree索引执行方式解析
低基数列上B-Tree索引的执行机制
通常我们会建议:当列的可选值少于100个(低基数列)时,优先使用Bitmap(位图)索引;而可选值超过100个的列,适合创建B-Tree索引。但如果在低基数列上创建了B-Tree索引,它的执行逻辑如下:
执行流程
1. 遍历B-Tree定位目标键值
和非低基数列的B-Tree索引执行逻辑一致,数据库从B-Tree的根节点出发,逐层向下检索,最终定位到目标键值所在的叶子节点分支。
非低基数列上的B-Tree索引执行方式参考:
2. 批量读取关联行指针
由于是低基数列,同一个键值会对应大量行记录,因此在目标叶子节点中,会连续存储指向这些行的物理地址(如磁盘块号+偏移量)。数据库会一次性读取该键值关联的所有行指针,形成一个规模较大的指针集合。
3. 回表读取实际数据
拿到行指针集合后,数据库会根据这些指针定位到磁盘上的实际数据块,读取对应的整行数据。这一步的IO开销是关键:当匹配行数极多时,回表操作需要频繁访问数据块,效率远低于Bitmap索引。
与其他索引的执行差异
- 和非低基数列B-Tree索引的区别:非低基数列每个键值仅对应少量行,回表IO开销低;低基数列键值对应大量行,回表IO成本显著上升,执行效率下降。
- 和Bitmap索引的区别:Bitmap索引通过位图位标记匹配行,能快速完成多条件的与/或运算,且无需大量回表;而低基数列上的B-Tree索引依赖指针回表,单条件查询开销高,组合查询效率更差。
低基数列上的Bitmap索引执行方式参考:
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐



