# 1. MySQL 的代价模型,query_cache、engine_condition_pushdown 的影响? A ICP 把非前缀索引条件下推到存储引擎过滤、减少回表(EXPLAIN 显示 Using index condition),query_cache 已在 8.0 移除 ✓ 正确答案 B ICP 只在全表扫描时生效 C ICP 会增加回表次数 D MySQL 8.0 仍默认启用 query_cache
# 2. PostgreSQL 的 seq_page_cost、random_page_cost、cpu_tuple_cost 等参数的语义? A cpu_tuple_cost 表示随机读一个页的代价 B random_page_cost 默认值为 0.1 C seq_page_cost 默认 1.0 为代价基准,random_page_cost 默认 4.0 反映 HDD 随机读昂贵,SSD 上调低后者可使索引扫描更受青睐 ✓ 正确答案 D 这些参数对计划选择没有任何影响
# 3. 不同操作的代价系数,Nested Loop、Hash Join、Sort、Aggregate 的代价? A Hash Join 永远比 Nested Loop 便宜 B Nested Loop 代价随内外层行数乘积膨胀,Hash Join 近似线性但内存溢出会落盘暴涨,Sort 是 n log n 量级 ✓ 正确答案 C Aggregate 只能使用排序实现 D Sort 的代价与行数无关
# 4. 代价模型(Cost Model)的组成,CPU、磁盘 I/O、网络 I/O 的代价权重? A 单机数据库代价以磁盘 I/O 与 CPU 为主,分布式数据库还需计入网络 shuffle 代价,权重可通过 cost 参数或代价表配置 ✓ 正确答案 B 代价权重无法调整 C 网络代价在单机 MySQL 中占主导 D 代价模型只考虑 CPU 一种资源
# 5. 基于规则的改写(RBO)如子查询展开(unnest)、谓词推导、外连接消除与 Join 消除各自的适用条件与前提(如无空值放大、约束保证唯一)是什么? A 谓词推导会增加中间行数 B 外连接消除不需要任何前提 C 任何子查询都可以无条件展开 D 外连接消除要求右表连接键唯一且无空值放大风险,子查询展开要求无 LIMIT/聚合副作用,Join 消除需要唯一约束保证 ✓ 正确答案
# 6. 优化器如何实现物化视图的自动查询改写(查询包含匹配 query subsumption、补偿谓词与聚合上卷)?为什么多数数据库需要显式开启且对改写失败难以诊断? A 聚合上卷要求查询分组比视图更细 B 查询谓词被视图覆盖(subsumption)且更窄时加补偿谓词过滤,分组是视图分组的超集时可聚合上卷;自动改写多需显式开启且失败无报错难以诊断 ✓ 正确答案 C 任何聚合函数都可以直接上卷 D 物化视图改写失败会有明确报错
# 7. 代价模型对优化器选择的影响,全表扫描 vs 索引扫描? A 索引扫描永远优于全表扫描 B 全表扫描与选择率无关 C 选择率越低索引扫描相对全表越占优,覆盖索引与较低的 random_page_cost 会进一步偏向索引,统计失真会错误地翻转该决策 ✓ 正确答案 D 覆盖索引会增加回表代价
# 8. 谓词上拉/下推与常量折叠如何改变执行计划?哪些改写必须小心外连接的 NULL 补齐语义与函数的副作用(非确定性函数)? A 常量折叠发生在每次执行时 B 非确定性函数可以安全折叠 C 任何条件下推都不影响外连接结果 D WHERE 条件下推到外连接右表会破坏 NULL 补齐语义,非确定性函数不能折叠也不能下推到循环内层重复求值 ✓ 正确答案
# 9. Hash Join 的代价模型,哈希表内存预算与 work_mem 不足时的落盘行为,为什么其代价与输入规模近似线性、与 Nested Loop 的交叉点如何判断? A Nested Loop 永远比 Hash Join 快 B Hash Join 代价与两表行数乘积成正比 C Hash Join 代价近似线性 O(|A|+|B|),work_mem 不足时会分批落盘使代价超线性上升,驱动集小且内层有索引时 Nested Loop 反而胜出 ✓ 正确答案 D work_mem 不影响 Hash Join 性能
# 10. MySQL optimizer_cost_model? A 代价模型只影响 EXPLAIN 展示 B optimizer_cost_model 参数在 8.0 仍可切换模型 C 修改代价表后立即自动生效 D MySQL 8.0 的代价模型由 mysql.server_cost 与 mysql.engine_cost 表驱动,修改后需 FLUSH OPTIMIZER_COSTS 生效,optimizer_cost_model 参数已移除 ✓ 正确答案
# 11. MySQL 的代价模型差异? A 两库的代价模型完全相同 B MySQL 也使用 random_page_cost 参数 C PG 无法配置代价权重 D MySQL 以块读取与行评估代价为主且不区分顺序/随机页权重,PG 显式区分 seq_page_cost 与 random_page_cost 并细分算子代价 ✓ 正确答案
# 12. PostgreSQL 的 cost-based optimizer? A 代价函数不依赖统计信息 B 重写阶段完成全部代价计算 C PG 使用固定规则选择计划 D PG 的 planner 生成多种访问路径与连接顺序并用代价函数比较,动态规划枚举 join 顺序,表数超过 geqo_threshold 时回退 GEQO 近似搜索 ✓ 正确答案
# 13. 代价模型在 JOIN 顺序选择? A join 选择率不影响顺序选择 B Hash Join 必须用大表建哈希表 C JOIN 顺序对总代价毫无影响 D "小表驱动大表"只对 Nested Loop 严格成立,Hash Join 的策略是小表建哈希表大表探测,统计失真会使顺序决策失误 ✓ 正确答案
# 14. SSD vs HDD 的代价权重差异,random_page_cost 从 4 调为 1.1? A SSD 的随机读比 HDD 的顺序读更贵 B random_page_cost 默认 4.0 是针对 HDD 随机读昂贵设计的,SSD 上随机与顺序读差距缩小,通常下调至 1.1 左右并用真实 workload 验证 ✓ 正确答案 C random_page_cost 是 MySQL 专有参数 D 该参数只影响写入性能
# 15. 代价估算的公式,rows × cost_per_row + pages × cost_per_page? A 代价只与行数有关 B 页数在规划期不参与估算 C 算子开销固定为零 D 总代价 ≈ 页数×每页代价 + 行数×每行代价 + 算子开销,其中页数与行数来自统计估算,统计失真直接传导为代价失真 ✓ 正确答案
# 16. random_page_cost 默认值? A 该参数只影响 EXPLAIN 展示 B random_page_cost 默认 4.0,在 SSD 上设置过大会让优化器高估随机访问代价、过度回避索引扫描而偏向全表扫描 ✓ 正确答案 C 默认 1.0,无需任何调整 D 默认值为 0.1
# 17. Nested Loop 的代价估算,外层驱动行数 × 内层索引探测代价,为何驱动集小且内层有高效索引时胜出,其启动成本与 Merge/Hash Join 的差异? A Nested Loop 的代价与内层探测次数无关 B Hash Join 输出第一行最快 C Nested Loop 代价约为外层行数×内层探测代价,驱动集小且内层有高效索引时胜出,且输出第一行最快,Hash Join 需先建表 ✓ 正确答案 D Merge Join 不需要任何排序或有序输入
# 18. PostgreSQL 的代价参数? A 代价参数只影响 EXPLAIN 展示不影响真实执行 B effective_cache_size 直接决定并行度 C cpu_index_tuple_cost 默认值为 1.0 D parallel_setup_cost 与 parallel_tuple_cost 调低会鼓励并行计划,effective_cache_size 通过估算缓存命中间接影响代价,调整需用真实基准验证 ✓ 正确答案
# 19. Sort 的代价估算,内存排序与磁盘归并的成本如何建模,work_mem 不足时的 external sort 对执行时间的影响? A external sort 不会产生任何磁盘 I/O B work_mem 与排序性能完全无关 C 数据量超过 work_mem 时排序会落盘生成归并段并多趟合并,I/O 代价显著上升,可用调大 work_mem、索引排序或 Top-N 堆排序缓解 ✓ 正确答案 D 内存排序一定比索引排序快
# 20. 代价模型中的 cost 参数如何通过实验校准,基于真实 workload 测量顺序扫描、索引扫描与随机 I/O 的相对代价,如何避免拍脑袋调参? A 校准只需看一眼 EXPLAIN 即可 B 代价参数与硬件介质无关 C 直接套用网上推荐值最可靠 D 应以实测的相对 I/O 耗时校准代价参数,用核心 SQL 基准集回归验证,并遵循单一变量与基线可回滚原则 ✓ 正确答案
# 21. cpu_tuple_cost 默认值? A 该参数只影响并行计划 B cpu_tuple_cost 默认 0.01,表示处理一行元组的估算 CPU 代价约为顺序读一页的 1% ✓ 正确答案 C 默认值为 1.0 D 默认值为 4.0
# 22. seq_page_cost 默认值? A 默认值为 4.0 B seq_page_cost 默认 1.0,是代价体系的基准单位,调优重点是保持锚点并调整 random_page_cost 等参数的相对值 ✓ 正确答案 C 默认值为 0.01 D 该参数必须随 workload 频繁大幅调整