交互式模拟器
Database Index Btree Cost模拟器
并列查看树结构、层级成本和范围扫描增长,理解索引性能的主导因素。
物理模型与主要公式
$$h=\lceil\log_f N\rceil$$
B-tree高度随行数N和分支数f呈对数变化。点查找主要受高度控制,范围扫描还受匹配行数和页面局部性影响。
如何解读
树结构图显示分支数增加时高度下降。
成本图显示页面读取时间直接影响延迟。
范围扫描图显示选择率变高后叶页扫描成为主导。
通过对话理解Database Index Btree Cost
🙋看Database Index Btree Cost时,应该先看哪里?调整行数 N后,图和数值都会变化,有点不好判断。
🎓先看B-tree高度,但不要只看数字。用B-tree层级示意图确认前提形状或状态,再用点查找成本看分布和变化方式。树结构图显示分支数增加时高度下降。
🙋行数 N变大时B-tree高度会变化,这比较直观。那扇出 f的影响要怎么读?
🎓逐步调整扇出 f并观察点查询成本,就能看出哪个因素在控制结果。B-tree高度随行数N和分支数f呈对数变化。点查找主要受高度控制,范围扫描还受匹配行数和页面局部性影响。 不要只算一个点,要在实际可能波动的范围内来回检查。
🙋范围扫描成本主要用来做什么?只看普通曲线不够吗?
🎓范围扫描成本用来找危险边界,以及余量突然变小的输入组合。成本图显示页面读取时间直接影响延迟。 例如数据库索引初步容量估算时,比单点结果更重要的是条件稍微偏离后会怎样。
🙋如果B-tree高度满足要求,就可以直接采用这个条件吗?
🎓这里适合作为初步判断。它对比较存储介质或缓存假设和区分点查询和范围查询瓶颈有帮助,但最终判断仍要结合标准、实测值、详细分析和厂家条件。范围扫描图显示选择率变高后叶页扫描成为主导。
实际使用
数据库索引初步容量估算。
比较存储介质或缓存假设。
区分点查询和范围查询瓶颈。
常见问题
先看B-tree高度和点查询成本。然后用B-tree层级示意图确认前提状态,再用点查找成本读取分布和偏差。树结构图显示分支数增加时高度下降。
先单独调整行数 N,再以相近幅度调整扇出 f,比较B-tree高度的变化。范围扫描成本能显示哪些输入组合会让余量或性能快速变化。
适合用于数据库索引初步容量估算。不要只看单点数值,而应扩大输入范围,确认B-tree高度是否仍有余量,再决定是否进入详细分析。
B-tree高度随行数N和分支数f呈对数变化。点查找主要受高度控制,范围扫描还受匹配行数和页面局部性影响。最终判断仍需结合标准、实测值、详细分析和厂家条件。
使用指南
- 输入表行数(如1000万行)和扇出因子(B树节点子节点数,典型值为128)
- 设置单次磁盘读取延迟(SSD通常0.1ms,HDD为5ms)和选择性比例(0.01表示1%匹配行数)
- 模拟器自动计算B树高度、点查询I/O成本和范围扫描页面访问量
具体计算示例
对MySQL InnoDB表进行索引优化:10000000行数据,扇出128,磁盘读延迟4ms。点查询成本为⌈log₁₂₈(10000000)⌉=4次磁盘读取,耗时约16ms。若选择性为0.001(0.1%),范围扫描需访问10000行,假设叶节点密度为100行/页,则需100个页面I/O,总成本约400ms。优化前全表扫描需40000次随机读。
实务注意事项
- 扇出因子受页面大小限制:InnoDB 16KB页面,键值8字节时扇出约2000,但实际为128-256因非均衡填充
- 范围扫描成本陡增于高选择性场景:选择性超过5%时,全表顺序扫描(9ms延迟)常优于索引扫描
- 写入密集表(频繁INSERT/UPDATE)应降低扇出以减少节点分裂开销,读密集表可提高扇出降低树高
- 联合索引扇出递减:三列索引(6+6+4字节)扇出仅为单列索引的50%,影响查询成本20%左右