复合索引设计与统计信息与基数

共 27 题
#

1. 冗余索引(Redundant Index)的检测,idx_a 与 idx_a_b 的覆盖关系?

A 因为 idx_a_b 以 a 为最左前缀完全包含 idx_a 的键列,所以 idx_a 属于可删除的冗余索引(除非其承担唯一约束等特殊职责) ✓ 正确答案
B idx_a 可以覆盖 idx_a_b,故后者冗余
C 冗余索引只占用少量空间,没有任何性能危害
D 只要两个索引包含相同列就算冗余,无需考虑列序
#

2. 复合索引与 OR 条件的兼容性,OR 是否破坏最左前缀?

A OR 与 AND 一样可以沿复合索引前缀逐列定位
B 只要 OR 涉及索引列就一定走索引合并
C OR 各分支独立并集,无法沿复合索引延续最左前缀,但每个分支都有索引时可走 Index Merge/BitmapOr,任一分支无索引则常退化为全表扫描 ✓ 正确答案
D a=1 OR a=2 无法改写成 IN 形式
#

3. 复合索引与查询模式(WHERE、ORDER BY、GROUP BY)的列序协同?

A 复合索引列序与查询模式完全无关
B ORDER BY 列必须放在索引最前面才能避免排序
C 范围条件可以放在排序列之前且不影响后续列排序
D 等值条件列放最前、排序/分组列紧随其后且方向一致、范围列放最后,可使一条查询同时免 filesort 与临时表 ✓ 正确答案
#

4. 复合索引的写入代价,每多一列,写入路径多一次 B-Tree 维护?

A 增加独立索引与增加复合索引列的代价完全相同
B 索引宽度与写入代价完全无关
C 复合索引每多一列就多维护一棵 B-Tree
D 复合索引是单棵 B+Tree,增加列不增加树的数量,但键变宽会增大页容量压力与写入放大 ✓ 正确答案
#

5. 复合索引的选择性(Selectivity)评估,基数(Cardinality)与分布?

A 平均基数越高索引越无用
B 选择性指去重值占行数比例,低基数列放前部会产生大量重复前缀键,且数据倾斜比平均基数更能决定索引的实际收益 ✓ 正确答案
C 优化器不依赖任何统计信息判断选择性
D 低基数列放在复合索引前部永远是最优选择
#

6. 覆盖复合索引(Covering Index)的设计,包含 SELECT、WHERE、ORDER BY 列?

A 覆盖索引必须包含表的所有列
B 覆盖索引只在全表扫描时生效
C 覆盖索引让查询全部列位于索引中免回表,设计顺序为等值列→排序列→SELECT 负载列,且 InnoDB 二级索引隐含主键可省去显式包含 ✓ 正确答案
D InnoDB 二级索引不包含主键信息,必须显式加入
#

7. 复合索引的 EXPLAIN 解读?

A Using index condition 表示发生了全表扫描
B key_len 与索引定义对比可判断复合索引实际使用了多少前缀列,Extra 的 Using index 表示覆盖扫描免回表 ✓ 正确答案
C ref 为 NULL 表示查询完全命中索引
D key_len 越短说明索引利用越充分
#

8. 复合索引对 NULL 的处理,PostgreSQL 中 NULL 的排序与索引行为(NULLS FIRST/LAST),NULLS NOT DISTINCT 唯一约束与部分索引如何配合?

A PG 的 IS NULL 查询在任何情况下都无法使用索引
B PG 的 B-Tree 索引存储 NULL 且默认按最大值排序(ASC 时 NULLS LAST),IS NULL 可用索引定位;NULLS NOT DISTINCT 让唯一约束把多个 NULL 视为重复值,部分索引可缩小 NULL 查询的扫描范围 ✓ 正确答案
C PG 的 B-Tree 索引不存储 NULL 键,IS NULL 必须依赖部分索引
D 声明 NULLS NOT DISTINCT 后,索引中的 NULL 会被全部删除
#

9. MySQL InnoDB 统计信息的持久化(innodb_stats_persistent)与采样(INNODB_STATS_PERSISTENT_SAMPLE_PAGES)?

A innodb_stats_persistent 把统计写入系统表避免每次开表采样抖动,innodb_stats_persistent_sample_pages(默认 20)控制采样页数,调大可提高准确性但 ANALYZE 更慢 ✓ 正确答案
B 持久化统计只存在于内存,重启即丢失
C 采样页数不影响任何统计结果
D 非持久化统计比持久化统计更稳定
#

10. MySQL 统计信息的二次采样与自动更新?

A InnoDB 只在手动执行 ANALYZE TABLE 时更新统计
B 二次采样会扫描整个索引树
C InnoDB 对索引做两阶段随机采样生成统计,且当修改行数超过约 1/16 表行数或发生 DDL 时自动重算统计 ✓ 正确答案
D innodb_stats_auto_recalc 只影响非持久化统计
#

11. PostgreSQL 中 ANALYZE 命令的作用与频率,自动 ANALYZE 触发条件?

A ANALYZE 只采集列级统计写入 pg_statistic,autovacuum 在修改行数超过 threshold + scale_factor×行数时自动触发,批量导入后建议手动 ANALYZE ✓ 正确答案
B autovacuum_analyze_scale_factor 默认值为 0.5
C 自动 ANALYZE 与修改行数完全无关
D ANALYZE 会回收死元组空间
#

12. 基数(Cardinality)估算的误差,均匀分布假设的失效场景?

A 多列相关不会影响选择率估算
B 均匀分布假设在任何数据下都成立
C 优化器默认假设均匀分布与列独立,数据倾斜和多列相关会使其选择率估算严重失真,需扩展统计或直方图修正 ✓ 正确答案
D 基数误差只影响 EXPLAIN 展示,不影响真实计划
#

13. 直方图(Histogram)的应用,频率直方图、等高直方图(PG 12+)?

A PG 不使用 MCV 列表
B 频率直方图适合大量不同值的连续列
C 等高直方图每个桶的行数可以差异巨大
D 频率直方图记录每个高频值的频率适合少量离散值,等高直方图每桶行数近似相等、边界为真实值,PG 12+ 用 MCV 与等高直方图组合估算 ✓ 正确答案
#

14. 优化器如何用索引统计信息估算 range 扫描行数(index dive vs 统计估算)

A index dive 永远比统计估算快
B index dive 沿 B-Tree 实测边界键值数、精度高但成本大,等值条件超过 eq_range_index_dive_limit(默认 200)时 MySQL 改用统计估算 ✓ 正确答案
C 统计估算在任何情况下都比 dive 精确
D eq_range_index_dive_limit 控制的是回表行数
#

15. 统计信息陈旧(Stale Statistics)的危害,误估行数导致错误计划?

A 统计陈旧使优化器按错误行数选择扫描方式与 join 策略,可用 EXPLAIN ANALYZE 对比估算与实际行数发现,再以 ANALYZE 修复 ✓ 正确答案
B 手动 ANALYZE 无法纠正误估计划
C 统计信息永远不会过期
D 统计陈旧只影响 EXPLAIN 展示不影响真实执行
#

16. 统计信息(Statistics)的类型,表级(pg_class)、列级(pg_stats)、直方图(pg_statistic)?

A pg_statistic 中的统计由每次查询实时生成
B pg_stats 可以直接修改统计值
C pg_class 存储列级直方图
D 表级行数与页数估算存于 pg_class,列级 MCV/直方图等存于 pg_statistic,pg_stats 是其过滤未授权列的可读视图 ✓ 正确答案
#

17. NULL 比例的统计,优化器对 NULL 分布的估算?

A IS NULL 的选择率与 null_frac 无关
B NULL 比例不影响任何估算
C pg_stats 不记录 NULL 相关信息
D PG 用 null_frac 记录 NULL 占比,等值估算先按 1-null_frac 折减,IS NULL 直接以 null_frac 作为选择率 ✓ 正确答案
#

18. MySQL mysql.innodb_table_stats?

A 该表存储查询缓存内容
B 该表只在服务器启动时初始化一次
C mysql.innodb_table_stats 记录每张表的估算行数与聚簇/非聚簇索引页数,由 ANALYZE、DDL 与自动重算更新,供优化器规划使用 ✓ 正确答案
D 优化器规划时不读取任何持久化统计
#

19. MySQL 的 ANALYZE TABLE?

A ANALYZE TABLE 重新计算 InnoDB 表的统计并写入持久化系统表,采用随机采样实现,执行期间需持有元数据锁 ✓ 正确答案
B ANALYZE TABLE 与采样页数无关
C ANALYZE TABLE 在 8.0 中只能由超级用户执行
D ANALYZE TABLE 会全表扫描并重建所有索引
#

20. MySQL 8.0 直方图的原理与应用,直方图如何改善非索引列的基数估计,采样桶数与更新策略对执行计划的影响?

A 直方图桶数越多规划一定越快
B 直方图会自动随每行写入更新
C MySQL 8.0 直方图为无索引列与倾斜数据提供分布信息,但不会随 DML 自动更新,需手动刷新,桶数默认 100 ✓ 正确答案
D 直方图只适用于已有索引的列
#

21. PostgreSQL pg_statistic 系统表?

A pg_statistic 每列只存一个数值
B pg_statistic 每列一行主记录加最多 5 组槽位,由 stakind 区分 MCV、直方图、相关性等统计类型,普通用户经 pg_stats 视图访问 ✓ 正确答案
C 任何用户都可直接修改 pg_statistic
D pg_statistic 由查询执行时实时生成
#

22. PostgreSQL pg_stats 视图?

A pg_stats 是 pg_statistic 的只读安全视图,提供 null_frac、n_distinct、most_common_vals、histogram_bounds、correlation 等字段 ✓ 正确答案
B pg_stats 只包含表级统计
C pg_stats 与 pg_statistic 无任何关系
D pg_stats 可以直接更新统计值
#

23. PostgreSQL 扩展统计与 n_distinct?

A 扩展统计不能改善多列基数估算
B n_distinct 为 -1 表示只有一个不同值
C n_distinct 负数表示按行数比例估算去重数,扩展统计的 ndistinct 类型可统计多列组合的真实基数,改善 GROUP BY 与 JOIN 估算 ✓ 正确答案
D n_distinct 只存绝对值
#

24. 扩展统计(Extended Statistics),PG 的 CREATE STATISTICS 处理多列相关?

A 扩展统计的 dependencies 描述列间函数依赖以纠正多列条件连乘低估,ndistinct 统计组合基数,mcv 列出多列最频组合,优化器匹配时自动使用 ✓ 正确答案
B dependencies 统计的是单列直方图
C 扩展统计只在 PG 17 之后可用
D 扩展统计需要改写业务 SQL 才能生效
#

25. 采样率(Sample Rate)对统计的影响,PG 的 default_statistics_target?

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

26. 统计信息波动导致的计划抖动(plan instability)与稳定化手段

A 计划抖动只影响内存占用不影响性能
B 统计在代价临界点附近波动会使计划反复切换,稳定手段包括校准统计、固定计划(SPM/Query Store/Hint)与监控计划版本 ✓ 正确答案
C 统计波动与计划选择完全无关
D 参数化查询不会引发任何计划切换
#

27. 低区分度列参与复合索引是否有价值(选择性 vs 覆盖收益)

A 低区分度列加入复合索引仍有价值:作前缀提供过滤、作后缀提供覆盖收益,价值取决于查询负载与实测,而非单纯选择性 ✓ 正确答案
B 选择性是索引价值的唯一标准
C 低基数列必然导致索引失效
D 低区分度列不应出现在任何索引中