索引膨胀、直方图与采样

共 25 题
#

1. MySQL 中 information_schema 与 OPTIMIZE TABLE 的膨胀检测?

A OPTIMIZE TABLE 不需要额外磁盘空间
B 可通过 information_schema.tables 的 DATA_FREE 与 DATA_LENGTH 估算碎片率,OPTIMIZE TABLE 重建表回收空间,大表需预留临时空间并选低峰执行 ✓ 正确答案
C 碎片对性能没有任何影响
D information_schema 无法查看表大小
#

2. REINDEX CONCURRENTLY 的工作原理,避免长时间锁表?

A REINDEX CONCURRENTLY 分两阶段构建并合并并发变更,期间基本不阻塞读写,但中断会留下 INVALID 索引需清理 ✓ 正确答案
B 它必须在事务块内使用
C 它不占用额外磁盘空间
D 它需要全程持有排他锁
#

3. VACUUM FULL 与 REINDEX 的取舍,表膨胀 vs 索引膨胀?

A 普通 VACUUM 立即把空间归还操作系统
B 普通 VACUUM 不归还磁盘空间,VACUUM FULL 重写表彻底回收(需排他锁),REINDEX 单独解决索引膨胀,可按膨胀来源取舍 ✓ 正确答案
C VACUUM FULL 可以并发执行
D REINDEX 会重写表数据
#

4. 索引膨胀(Index Bloat)的原因,长事务、删除不回收、MVCC 版本?

A 索引项不会随 MVCC 产生死项
B VACUUM 会自动收缩索引文件
C 长事务卡住回收 horizon 使死版本无法清理,加上高频更新与滞后的 autovacuum 共同导致索引膨胀累积,VACUUM 不会收缩索引文件 ✓ 正确答案
D 长查询不影响索引膨胀
#

5. 索引重建的方法,REINDEX(PG)、ALTER TABLE ... REBUILD(Oracle/MySQL)?

A 三种数据库的重建语法完全相同
B MySQL 的 OPTIMIZE TABLE 只重建一个索引
C Oracle 的 REBUILD ONLINE 会阻塞所有 DML
D PG 用 REINDEX CONCURRENTLY 在线重建,MySQL 无 REINDEX 可用 DROP+ADD(INPLACE 在线)或 OPTIMIZE,Oracle 用 ALTER INDEX ... REBUILD ONLINE ✓ 正确答案
#

6. 索引膨胀的预防,autovacuum、fillfactor、统计信息?

A fillfactor 在页内预留空位减少页分裂,autovacuum 及时回收死元组,配合页密度监控与定期 REINDEX 预案共同预防膨胀 ✓ 正确答案
B 长事务不影响膨胀预防效果
C autovacuum 与索引膨胀无关
D fillfactor 越低索引文件越小
#

7. MySQL ALGORITHM=INPLACE 的 REBUILD?

A 8.0 中修改主键总是走 INPLACE
B INPLACE 不需要任何额外空间
C INPLACE 会阻塞所有并发 DML
D ALGORITHM=INPLACE 在原表上构建新结构并重放 row log 增量,期间允许并发 DML,但部分操作仍会退化为 COPY ✓ 正确答案
#

8. MySQL ANLAYZE TABLE 与 REBUILD?

A ANALYZE TABLE 会重建所有索引
B ANALYZE TABLE 只刷新统计不重建数据,OPTIMIZE 重建后再 ANALYZE 可让统计反映整理后的物理布局 ✓ 正确答案
C OPTIMIZE TABLE 不更新任何统计
D ANALYZE 与 REBUILD 的作用完全相同
#

9. MySQL OPTIMIZE TABLE?

A OPTIMIZE TABLE 重建表回收碎片并刷新统计,8.0 走在线 DDL 但需临时空间,应在碎片率高时低峰执行 ✓ 正确答案
B OPTIMIZE 会永久阻塞所有读写
C 碎片率越低 OPTIMIZE 收益越高
D OPTIMIZE 只更新统计信息
#

10. MySQL innodb_index_stats?

A innodb_index_stats 通过 n_diff_pfx 系列前缀基数、sample_size 与 last_update 支撑优化器估算,可用于排查统计陈旧与采样不足 ✓ 正确答案
B 该表只存在于内存中
C 该表无法查看采样页数
D 该表存储的是查询历史
#

11. PostgreSQL CONCURRENTLY 的限制?

A 失败不影响任何后续操作
B 它需要全程排他锁阻塞 DML
C CONCURRENTLY 比普通索引构建更快
D CREATE INDEX CONCURRENTLY 不能在事务块中执行,耗时约为普通索引两倍,失败会留下 INVALID 索引需手工清理 ✓ 正确答案
#

12. PostgreSQL REINDEX 失败回滚?

A 普通 REINDEX 失败会损坏数据
B CONCURRENTLY 失败不会产生任何残留
C 普通 REINDEX 失败事务回滚、原索引完好,REINDEX CONCURRENTLY 失败可能留下 INVALID 新索引需清理 ✓ 正确答案
D 磁盘空间不足不影响 REINDEX
#

13. PostgreSQL pgstattuple 扩展?

A pgstattuple 只返回表行数
B 该扩展默认已安装无需 CREATE EXTENSION
C pgstatindex 返回 avg_leaf_density 与碎片度,是诊断索引膨胀的直接依据,pgstattuple 系列函数需扫描对象且成本高 ✓ 正确答案
D pgstattuple 不区分死元组
#

14. VACUUM 与 REINDEX 的差异?

A VACUUM 回收死元组空间供复用但不压缩文件,REINDEX 重建索引压缩文件,两者不可互相替代 ✓ 正确答案
B VACUUM FULL 不需要排他锁
C REINDEX 能回收表死元组
D VACUUM 会缩小索引文件大小
#

15. autovacuum 与索引?

A autovacuum 会缩小索引文件
B autovacuum 的触发频率与索引膨胀直接挂钩
C autovacuum 会自动执行 REINDEX
D autovacuum 只清理索引死项并标记空间可复用,不压缩索引文件,且其触发与索引膨胀程度无关 ✓ 正确答案
#

16. pgstat 索引膨胀查询?

A pg_stat_user_indexes 提供 idx_scan 等使用率统计,结合 pg_stat_user_tables 的 n_dead_tup 与 pgstatindex 页密度可形成膨胀监控闭环 ✓ 正确答案
B pg_stat 视图直接给出页密度数值
C idx_scan 为 0 说明索引已经膨胀
D pg_stat 无法区分表与索引
#

17. MySQL 8.0 直方图(SAMPLING HISTOGRAM)的语法与使用?

A 直方图会随每行写入自动更新
B MySQL 8.0 支持多列直方图
C 用 ANALYZE TABLE ... UPDATE HISTOGRAM ON 列 WITH N BUCKETS 创建(默认 100 桶),数据存于 information_schema.COLUMN_STATISTICS,且不随 DML 自动更新 ✓ 正确答案
D 有索引的列总是优先使用直方图
#

18. PostgreSQL 中 default_statistics_target 参数控制直方图桶数?

A 该参数只影响 ANALYZE 速度
B 列级 SET STATISTICS 设置无效
C default_statistics_target(默认 100)决定直方图桶数与 MCV 上限(约 target 个)及采样规模(约 300×target 行),调大提高精度但 ANALYZE 变慢 ✓ 正确答案
D 直方图桶数固定不可调
#

19. 直方图(Histogram)的应用,频率直方图(Frequency Histogram)与等高直方图(Height-Balanced Histogram)?

A 直方图只用于排序优化
B 等高直方图每个桶的行数差异很大
C 频率直方图适合连续值分布
D 频率直方图适合少量离散值的等值估算,等高直方图适合大量不同值的范围估算,PG 用 MCV 与等高直方图互补 ✓ 正确答案
#

20. 等高直方图的边界(Boundary)选择与最频值(Most Frequent Values)?

A 边界可以是任意插值出来的虚拟值
B 等高直方图桶边界为真实数据值且每桶行数近似相等,高频值单独放 MCV 列表避免占用过多桶,估算先查 MCV 再插值 ✓ 正确答案
C MCV 与直方图互斥,只能二选一
D 桶内行数没有任何约束
#

21. MySQL ANALYZE TABLE ... UPDATE HISTOGRAM?

A 直方图自动随 DML 更新
B UPDATE HISTOGRAM 默认 100 桶、上限 1024,NULL 值不入直方图,且需手动随数据变化刷新 ✓ 正确答案
C 桶数没有任何上限
D 支持多列组合直方图
#

22. MySQL 直方图的 SQL 语法?

A DROP HISTOGRAM 会删除相关索引
B 直方图创建后自动随写入更新
C 用 ANALYZE TABLE ... UPDATE/DROP HISTOGRAM 管理直方图,经 information_schema.COLUMN_STATISTICS 以 JSON 查看,且直方图数据只读 ✓ 正确答案
D 可以手工 UPDATE 直方图 JSON
#

23. PostgreSQL pg_stats.histogram_bounds?

A 它替代了 most_common_vals 的功能
B 数组长度等于桶数
C 边界为等间距的虚拟值
D histogram_bounds 为升序的真实值边界数组,长度=桶数+1,桶行数近似相等,用于范围条件的插值估算 ✓ 正确答案
#

24. PostgreSQL 直方图与优化器?

A 等值条件也查直方图桶频次
B 直方图用于所有条件类型
C 直方图主要用于范围条件插值,等值优先 MCV,多列相关、JOIN 选择率与函数包裹列等场景需扩展统计或表达式索引 ✓ 正确答案
D JOIN 选择率用直方图精确估算
#

25. ANALYZE 的随机块采样机制与 default_statistics_target 如何影响统计准确性?采样过少会引发什么误估?

A ANALYZE 总是全表逐行扫描统计
B 采样量与 default_statistics_target 无关
C 采样过少只影响速度不影响准确性
D ANALYZE 做块级随机采样,样本约 300×target 行,采样过少会漏掉高频值、低估高基数列的 n_distinct 并使直方图粗糙 ✓ 正确答案