大量删除后 B+ 树索引为什么会出现空洞和性能下降,如何重建?
围绕“大量删除后 B+ 树索引为什么会出现空洞和性能下降,如何重建”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释删除只标记不收缩导致的稀疏页问题与 REINDEX 的代价。
索引与执行计划专题面试题第 1 页,显示第 1–44 题,共找到 44 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“大量删除后 B+ 树索引为什么会出现空洞和性能下降,如何重建”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释删除只标记不收缩导致的稀疏页问题与 REINDEX 的代价。
围绕“为什么 B+ 树索引的高度通常只有 3~4 层就能支撑千万级数据”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用页大小和扇出做量级估算说明层数与 IO 次数的关系。
围绕“B+ 树索引在插入时发生页分裂会带来什么性能影响,如何缓解”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明随机插入导致的分裂、空间利用率下降与顺序递增主键的缓解思路。
围绕“MySQL/PostgreSQL 的 B+ 树索引是如何组织并支持等值查找的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讲清非叶子节点只存键值、叶子节点链表相连的结构与 O(log n) 查找过程。
围绕“B 树和 B+ 树有什么区别,为什么数据库索引普遍选用 B+ 树”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须从非叶子节点是否存数据、叶子链表对范围扫描的影响作答。
围绕“聚簇索引和二级索引在回表查询上有什么本质差异”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须讲清二级索引叶子存主键值需要二次查找的回表过程。
围绕“复合索引 (a, b, c) 的最左前缀原则具体是如何生效的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用 (a)、(a,b)、(a,b,c) 命中而 (b,c) 不命中说明键序决定可用性。
围绕“复合索引 (a, b) 能避免 ORDER BY b 排序吗,什么条件下可以”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 a 等值过滤时索引天然按 b 有序可省 sort,a 是范围时不行。
围绕“设计复合索引时,等值列和范围列的先后顺序应该怎么排”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出等值列在前、范围列在后的规则及其对扫描区间的影响。
围绕“对经常组合查询的两个列,建复合索引和建两个单列索引哪种更好”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须比较索引合并交集与单复合索引的效率与维护成本。
围绕“什么是覆盖索引,它为什么能显著减少查询耗时”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明索引包含查询所需全部列时无需访问堆表的原理。
围绕“PostgreSQL 的 INCLUDE 非键列和直接加进索引键有什么区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分 INCLUDE 列不参与排序只随叶子存储的设计意图。
围绕“PostgreSQL 的 Index-Only Scan 为什么有时仍然要访问堆表”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释可见性判断依赖 visibility map、VACUUM 后才真正免堆访问。
围绕“用覆盖索引消除回表时,把很多列塞进索引会带来什么代价”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须权衡查询加速与写入、膨胀、统计信息成本。
围绕“EXPLAIN 和 EXPLAIN ANALYZE 的区别是什么,生产环境用后者要注意什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 ANALYZE 真正执行 SQL 返回实际行数与耗时的副作用风险。
围绕“EXPLAIN (ANALYZE, BUFFERS) 里的 shared hit 和 read 分别说明什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分共享缓冲命中与磁盘读,并说明用它定位 IO 瓶颈的方法。
围绕“EXPLAIN 输出中的 cost=0.00..8.27 两个数字分别代表什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释启动成本与累计成本的含义及基于代价的选路逻辑。
围绕“MySQL 的 FORCE INDEX 什么时候应该使用,长期依赖它有什么风险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明统计失真时的临时干预价值与数据变化后计划僵化的隐患。
围绕“EXPLAIN 估算的 rows 和实际行数差几个数量级时该怎么定位原因”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出检查统计信息新鲜度、多列相关、参数化查询三条定位路径。
围绕“EXPLAIN 出现 Seq Scan 一定说明索引失效了吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明小表、低选择性谓词下优化器主动选全表扫描是合理决策。
围绕“表达式索引如何解决 WHERE lower(email) = ? 这类查询的索引问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明按表达式值建索引、查询表达式需与索引定义精确匹配。
围绕“IN 列表很长时为什么优化器可能放弃索引转而全表扫描”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须用累计选择性超过阈值导致随机回表更贵来解释。
围绕“LIKE '%abc' 前导通配符为什么用不上普通 B 树索引,有哪些替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释键序无法定位前缀的机制并列出 trigram、全文检索替代。
围绕“有索引时嵌套循环连接为什么会比哈希连接更快,什么条件下反转”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用驱动表行数与被驱动表索引查找成本的乘积判断反转点。
围绕“对索引列使用函数或隐式类型转换为什么会导致索引失效”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明谓词被改写后无法匹配索引键序的原理。
围绕“IS NULL 查询能用上 B 树索引吗,PostgreSQL 和 MySQL 行为有何差异”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 PostgreSQL B 树存 NULL 可索引而部分实现不存的差异。
围绕“WHERE a = 1 OR b = 2 为什么常常导致索引利用率差,怎么改写”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明优化器难以同时用两个索引键序及 UNION/UNION ALL 改写方案。
围绕“PostgreSQL 部分索引适合什么场景,比全索引有什么优势”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出只索引满足条件的子集、减小体积提升效率的判断。
围绕“为什么复合索引中范围条件会让其后的列无法继续用于精确定位”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释范围扫描后右列键值不再有序、只能回表过滤的机制。
围绕“什么是索引选择性,选择性低到什么程度索引就不值得用了”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出选择性=基数/行数的定义与低选择性时优化器弃用索引的判断。
围绕“优化器如何估算一个 LIKE 'abc%' 条件会过滤出多少行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 MCV 与直方图在范围/前缀匹配估算中的作用。
围绕“复合索引里应该把高选择性列放前面吗,这个常见说法对不对”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须辨析「高选择性在前」只是经验法则、实际取决于查询谓词模式。
围绕“MySQL 8.0 的索引跳跃扫描能在什么条件下绕过最左前缀限制”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明前导列基数低时枚举前导值实现跳跃扫描的适用边界。
围绕“ORDER BY a ASC, b DESC 时为什么单列复合索引可能帮不上忙”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明键序一致才能复用索引序、混合方向需建匹配方向的索引。
围绕“MySQL 的 filesort 是什么,它是额外文件排序吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须澄清 filesort 不一定是磁盘文件排序、内存放不下才落盘。
围绕“GROUP BY 能借助索引避免排序吗,条件是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明分组列与索引前缀顺序一致时可按序聚合。
围绕“为什么 ORDER BY ... LIMIT n 在有合适索引时只需扫描少量行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明按索引顺序取前 n 行即可终止的执行方式与无索引时的全排序对比。
围绕“PostgreSQL 排序溢出到磁盘在 EXPLAIN 中怎么看,如何调优”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须识别 Sort Method: external merge 信号并给出调大 work_mem 的方案。
围绕“ANALYZE 采集的统计信息包含哪些内容,过期统计会导致什么后果”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须列出 MCV、直方图、空值比例并说明陈旧统计导致选错计划。
围绕“PostgreSQL 多列强相关时单列统计为何会严重低估行数,怎么解决”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明独立列假设导致的选择性相乘误差与 CREATE STATISTICS 的作用。
围绕“为什么大批量数据变更后执行计划突然变差,如何排查统计信息问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出对比估算行数与实际行数、ANALYZE 刷新、调整采样率的排查路径。
围绕“default_statistics_target 调大对执行计划质量有什么影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明提高采样率提升估算精度的同时增加 ANALYZE 成本。
围绕“唯一索引和普通索引在查询性能和写入开销上有差别吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明唯一索引可提前终止等值查找、写入需唯一性检查的权衡。
围绕“为什么不建议在每张表的每个列上都建索引”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须从写放大、空间占用、优化器选错索引的风险三方面作答。