# 1. 主键命名,id、table_id、pk_table 的取舍? A 每张表必须用不同命名 B 列名统一用 id 或 表名_id,约束名用 pk_表名,关键是全库一致与可读性 ✓ 正确答案 C 约束名与列名无关 D 主键命名无意义
# 2. 外键命名,fk_source_target、source_id 的取舍? A 约束名无需规范 B 外键列名必须与主键相同 C 列名用 目标表_id,约束名用 fk_来源_目标,便于定位与维护 ✓ 正确答案 D 外键命名与查询无关
# 3. 索引命名,idx_t_col、t_col_idx 的取舍? A 索引命名可随意 B 用 idx_表名_列名 或 表名_列名_idx 表达表+列,全库统一便于维护 ✓ 正确答案 C 索引名与列无关 D 索引命名不影响维护
# 4. PostgreSQL 的 public 模式命名? A public 不可访问 B public 是唯一 schema C public 是默认 schema,对象默认存放其中,可用 search_path 控制查找顺序 ✓ 正确答案 D search_path 与 schema 无关
# 5. B-Tree 的查找、插入、删除算法,页分裂(Page Split)与合并的实现? A 分裂不影响性能 B 页分裂只发生在删除 C 合并只在根节点 D 节点满时页分裂、过空时合并,通过分裂合并维持平衡保证 O(log n) ✓ 正确答案
# 6. B-Tree 索引的物理结构,内部节点、叶节点、叶子链表的高效范围扫描原理? A 叶节点不与兄弟相连 B 叶节点存键并通过链表相连,范围扫描沿链表顺序遍历高效 ✓ 正确答案 C 内部节点存数据行 D 范围扫描需重新搜索树
# 7. B-Tree 索引的等值查询(=)与范围查询(BETWEEN、>、<)的执行效率差异? A 等值查询 O(log n) 定位,范围查询定位起点后沿叶子链表扫描,效率与结果集大小相关 ✓ 正确答案 B 两者效率相同 C 范围查询总是更快 D 等值查询需全表扫描
# 8. B-Tree 索引的统计信息,pg_stat_user_indexes、mysql.innodb_index_stats? A pg_stat_user_indexes 与 mysql.innodb_index_stats 记录索引使用/统计,用于优化器与索引维护 ✓ 正确答案 B 统计信息与优化无关 C 索引统计无法查看 D 统计信息只存于内存
# 9. B-Tree 索引的选择性(Selectivity)与基数(Cardinality)对查询性能的影响? A 选择性 = 不同值数/总行数,高选择性索引更有效,低选择性列建索引收益低 ✓ 正确答案 B 选择性越低越有效 C 基数与选择性无关 D 优化器不依赖统计
# 10. Fillfactor 参数对 B-Tree 写入性能的影响,预留空间减少页分裂? A 较小 fillfactor 预留空间减少随机插入的页分裂,但增加索引体积 ✓ 正确答案 B fillfactor 越大越好 C fillfactor 与页分裂无关 D 顺序插入也需预留空间
# 11. InnoDB 的聚簇表(IOT),每张表必须有聚簇索引、行的物理存储顺序? A 无主键表不需聚簇索引 B 每表可有多个聚簇索引 C 数据物理顺序与主键无关 D 数据按主键顺序物理存储,每表必须有聚簇索引,无主键时选唯一索引或隐式 rowid ✓ 正确答案
# 12. PostgreSQL 的堆表(Heap Table)与 Oracle 的聚簇表(IOT)的存储差异? A IOT 需回表 B 两者相同 C PG 也存储在主键索引 D PG 堆表按插入顺序存储、主键独立需回表,Oracle IOT 数据按主键存于索引叶节点无需回表 ✓ 正确答案
# 13. UUID 主键为何对聚簇索引不友好,随机性导致频繁页分裂? A 随机主键对聚簇索引友好 B UUID 主键顺序插入 C UUID 主键不分裂页 D UUID v4 随机导致插入页分裂、碎片化,对聚簇索引不友好 ✓ 正确答案
# 14. 最左前缀原则(Leftmost Prefix)的语义,B-Tree 复合索引的列序依赖? A 复合索引只能匹配以左起列开始的查询,列序决定可匹配的查询前缀 ✓ 正确答案 B 任意列序都能命中索引 C 最左列放范围查询 D 复合索引列序无关紧要
# 15. 索引合并(Index Merge)的取舍,MySQL 的 union、intersect 优化? A 复合索引比索引合并慢 B Index Merge 总是最优 C 索引合并支持排序 D Index Merge 对多个索引分别扫描后合并,OR 用 union、AND 用 intersect,但不如复合索引高效 ✓ 正确答案
# 16. 索引跳跃扫描(Index Skip Scan)的应用,MySQL 8.0+ 对复合索引的优化? A Skip Scan 无需最左列低基数 B MySQL 8.0 的 Skip Scan 可跳过最左列用后续列查索引,但最左列需低基数 ✓ 正确答案 C Skip Scan 总是比全表扫描差 D Skip Scan 是 MySQL 5.7 特性
# 17. 聚簇索引(Clustered Index)与非聚簇索引(Secondary Index)的根本差异,行数据是否按索引顺序存储? A 聚簇索引叶节点存数据行、决定物理顺序,非聚簇索引存键+指针需回表 ✓ 正确答案 B 两者都存数据行 C 非聚簇索引决定物理顺序 D 聚簇索引需回表
# 18. 覆盖索引(Covering Index)的实现,INCLUDE 子句与 USING 子句的差异? A USING 决定覆盖列 B INCLUDE 列参与排序 C 覆盖索引仍需回表 D 覆盖索引包含查询所需列避免回表,INCLUDE 附加列不参与排序仅做覆盖 ✓ 正确答案
# 19. B-Tree 与 B+Tree 的差异,叶子节点链表 vs 内部节点数据存储? A B-Tree 数据只在叶节点 B B+Tree 数据只在叶节点且叶节点链表相连,范围扫描高效,内部节点只存键 ✓ 正确答案 C B+Tree 内部节点存数据 D 两者叶子节点都无链表
# 20. B-Tree 在 OLTP 与 OLAP 场景的取舍? A B-Tree 两者都最优 B B-Tree 适合 OLAP C 列存适合 OLTP D B-Tree 适合 OLTP 点查与单行更新,OLAP 大范围聚合用列存更优 ✓ 正确答案
# 21. B-Tree 的并发控制,Latch 与 Lock 的协同? A Latch 是短时保护索引页的轻量锁,Lock 是事务级逻辑锁,二者协同 ✓ 正确答案 B Latch 与 Lock 相同 C B-Tree 无需并发控制 D 页分裂用 Lock
# 22. B-Tree 索引的 LIKE 前缀匹配('abc%')为何能走索引? A 前缀 LIKE 不走索引 B 所有 LIKE 都走索引 C LIKE '%abc' 走索引 D 前缀 LIKE 'abc%' 等价范围查询可走索引,后缀匹配无法定位起点不走索引 ✓ 正确答案
# 23. B-Tree 索引的 NULL 值处理,PostgreSQL 唯一约束中多 NULL 共存? A PostgreSQL 唯一索引允许多个 NULL 共存,NULL 默认排最后 ✓ 正确答案 B 唯一索引只允许一个 NULL C NULL 不参与索引 D NULL 排最前
# 24. 函数索引(Expression Index)的实现,LOWER(col) 索引键? A 函数索引与普通索引相同 B 对表达式结果建索引,查询 WHERE 需与索引表达式完全一致才能命中 ✓ 正确答案 C 查询无需匹配表达式 D 函数索引牺牲查询性能
# 25. 索引碎片(Index Fragmentation)的检测与重建? A 碎片不影响性能 B 碎片源于更新/随机插入,用 REINDEX(PG)或 OPTIMIZE(MySQL)重建,需低峰期执行 ✓ 正确答案 C 重建无锁 D 碎片无法检测
# 26. MySQL ALTER TABLE ... ENGINE=InnoDB 是否重建索引? A 是 no-op 不重建 B 会重建表与索引、回收碎片,但耗时且占用临时空间 ✓ 正确答案 C 只重建索引不复制数据 D 无任何锁
# 27. PostgreSQL REINDEX 的语法? A CONCURRENTLY 是 MySQL 语法 B REINDEX 只能重建单个索引 C REINDEX 总是阻塞 D REINDEX 支持 INDEX/TABLE/SCHEMA 粒度,CONCURRENTLY 实现在线重建不阻塞 ✓ 正确答案
# 28. Hash 索引的原理,哈希函数映射到桶(Bucket),等值查询 O(1) 但不支持范围? A Hash 索引保持有序 B Hash 索引支持范围查询 C Hash 索引等值 O(log n) D 哈希函数映射到桶,等值 O(1),但不支持范围查询与排序 ✓ 正确答案
# 29. MySQL InnoDB 不支持显式 Hash 索引,但自适应哈希索引(AHI)的实现? A AHI 无法关闭 B 用户可显式建 Hash 索引 C AHI 持久化到磁盘 D InnoDB 不支持显式 Hash 索引,但自动为高频索引页构建内存 AHI 加速等值查询 ✓ 正确答案
# 30. PostgreSQL 中 Hash 索引曾被标记为实验性的原因,WAL 不记录、崩溃恢复?PG 10+ 已修复? A 早期 Hash 索引一直可靠 B 早期 Hash 索引不记录 WAL、崩溃无法恢复,故标记实验性,PG 10 重写修复 ✓ 正确答案 C PG 10 删除 Hash 索引 D Hash 索引从未实验性
# 31. 表达式索引的执行计划,索引键与 WHERE 子句的精确匹配要求? A WHERE 需与索引表达式精确匹配才走索引,用 EXPLAIN 可验证 ✓ 正确答案 B 任意写法都命中 C 表达式索引无需匹配 D 优化器总能识别
# 32. MySQL MEMORY 引擎的 HASH 索引应用? A MEMORY 引擎支持 HASH 索引适合等值查询,但数据存内存重启丢失、受大小限制 ✓ 正确答案 B MEMORY 引擎支持范围查询用 HASH C MEMORY 数据持久化 D HASH 索引占磁盘
# 33. PostgreSQL 中 Hash 索引与 B-Tree 索引的性能基准? A Hash 功能更全 B Hash 支持范围查询 C B-Tree 等值总比 Hash 快 D 等值查询 Hash 略快,但 B-Tree 支持范围/排序,功能更全,通用场景选 B-Tree ✓ 正确答案
# 34. 表达式索引与函数稳定性(IMMUTABLE)的依赖? A 函数稳定性与索引无关 B 任何函数都可建索引 C now() 可建表达式索引 D 表达式索引要求函数 IMMUTABLE,STABLE/VOLATILE 函数不能用于索引 ✓ 正确答案
# 35. CREATE INDEX ON t ((col1 || col2)) 的复合表达式索引? A 复合表达式索引按列分别索引 B 复合表达式索引无需双重括号 C 查询任意表达式都命中 D 对 col1||col2 拼接结果建索引,查询需匹配同表达式,表达式需双重括号包裹 ✓ 正确答案
# 36. Hash 索引的 O(1) 复杂度验证? A Hash 索引范围查询 O(1) B Hash 索引总是 O(1) 且无冲突 C Hash 索引 O(log n) D 等值查询平均 O(1) 与数据量无关,但哈希冲突会退化性能 ✓ 正确答案
# 37. MySQL MEMORY 引擎的 BTREE 与 HASH 取舍? A HASH 支持范围查询 B HASH 等值快但不支持范围/排序,BTREE 支持范围/排序,按查询模式选择 ✓ 正确答案 C BTREE 等值更快 D 两者完全相同
# 38. MySQL 自适应哈希索引的开启条件? A AHI 由 innodb_adaptive_hash_index 控制默认开启,自动为高频等值查询构建内存哈希 ✓ 正确答案 B AHI 需手动创建 C AHI 默认关闭 D AHI 不占内存
# 39. PostgreSQL 10 之前 Hash 索引的限制? A 早期 Hash 索引无 WAL、崩溃无法恢复、不支持复制,被标记实验性 ✓ 正确答案 B 早期 Hash 索引完全可靠 C 早期 Hash 支持复制 D 早期 Hash 记录 WAL
# 40. PostgreSQL CREATE INDEX ... USING HASH 的语法? A Hash 索引支持范围 B 只能默认 B-Tree C 用 USING HASH 显式创建 Hash 索引,PG 10+ 可用,适合等值查询 ✓ 正确答案 D USING HASH 是 MySQL 语法
# 41. 表达式索引在 OLAP 的应用,对 date_trunc、lower 等函数化列建索引加速分组过滤,其写入放大代价与生成列/物化列方案的选型? A 生成列无法建索引 B 表达式索引无写入代价 C 对 date_trunc/lower 建索引加速分组过滤,但增加写入放大,可用生成列方案替代 ✓ 正确答案 D 表达式索引查询无需匹配
# 42. BRIN、SP-GiST、GiST、GIN 索引的取舍,写入、查询、空间? A BRIN 查询精度高 B BRIN 省空间快写入适合有序大表,GIN 适合多值/全文,GiST 适合空间/范围 ✓ 正确答案 C GIN 无写入开销 D GiST 适合多值
# 43. GIN 索引的 fastupdate 与 cleanup 机制,延迟插入与清理? A fastupdate 立即更新主索引 B fastupdate 把新键暂存 pending list 延迟更新主索引,提升写入但查询需合并 ✓ 正确答案 C pending list 无清理 D fastupdate 降低写入性能
# 44. GIN 索引的 jsonb_path_ops 与 jsonb_ops 索引策略差异? A jsonb_path_ops 支持 ? 操作符 B 两者完全相同 C jsonb_ops 更小 D jsonb_path_ops 更小更快只支持 @>,jsonb_ops 功能全支持 ? 等键存在查询 ✓ 正确答案
# 45. GIN 索引的写入开销,每个键单独索引项,写入放大? A GIN 写入开销小 B GIN 每个键单独索引项,一行多键导致写入放大,适合写少读多场景 ✓ 正确答案 C GIN 每个键只一个索引项 D GIN 无写入放大
# 46. GIN(Generalized Inverted Index)索引的原理,倒排索引,适合多值类型(数组、JSONB、tsvector)? A GIN 是倒排索引,把键映射到行集合,适合数组、JSONB、tsvector 等多值类型 ✓ 正确答案 B GIN 适合单值列 C GIN 是正排索引 D GIN 不支持全文
# 47. GiST 在 PostGIS 中的空间索引应用,R-Tree 实现? A PostGIS 不用 GiST B GiST 只用于全文 C 空间索引用 B-Tree D GiST 用 R-Tree(MBR 组织)实现空间索引,加速 PostGIS 的空间查询 ✓ 正确答案
# 48. GiST(Generalized Search Tree)的应用,空间数据、范围、全文检索? A 范围类型用 B-Tree B GiST 只适合等值 C GiST 通用搜索树,适合空间数据、范围类型、最近邻等复杂查询 ✓ 正确答案 D GiST 不支持空间
# 49. SP-GiST(Space-Partitioned GiST)的应用,IP 范围、trie 结构? A SP-GiST 与 GiST 相同 B SP-GiST 分区可重叠 C SP-GiST 适合所有类型 D SP-GiST 用不相交空间分区,适合 IP 范围、trie 前缀等可划分数据 ✓ 正确答案
# 50. GiST 索引在范围类型(range)的应用? A GiST 支持范围类型的重叠/包含查询,配合 EXCLUDE 约束实现区间不重叠 ✓ 正确答案 B 范围类型用 B-Tree C GiST 不支持范围查询 D 范围查询无需索引
# 51. SP-GiST 在 ltree 的应用? A ltree 查询需全表扫描 B ltree 用 B-Tree C SP-GiST 不支持 ltree D SP-GiST 按 ltree 路径前缀分区,加速祖先后代等层级查询 ✓ 正确答案
# 52. GIN 索引在 JSONB 上的应用? A GIN 不支持 JSONB B JSONB 用 B-Tree C GIN 支持 JSONB 的 @>、?、?| 等操作符,加速半结构化查询 ✓ 正确答案 D JSONB 无法建索引
# 53. GIN 索引的 fastupdate 参数? A fastupdate 只影响查询 B fastupdate 控制延迟更新,开启提升写入但查询需查 pending list,关闭却写慢 ✓ 正确答案 C fastupdate 默认关闭 D fastupdate 影响空间索引
# 55. PostgreSQL 中如何创建 GIN 索引? A GIN 索引需特殊语法 B GIN 只能用于 B-Tree C 用 CREATE INDEX ... USING GIN 对数组/JSONB/tsvector 建倒排索引 ✓ 正确答案 D GIN 只用于单值列
# 56. PostgreSQL 中如何选择 GIN 与 GiST? A 两者可互换 B 空间用 GIN C 全文用 GiST D 多值/全文用 GIN,空间/范围用 GiST,按数据类型匹配索引方法 ✓ 正确答案
# 57. gin_clean_pending 函数? A 该函数创建 GIN 索引 B 该函数合并 GIN 索引 pending list 到主索引,VACUUM 也会自动清理 ✓ 正确答案 C pending list 无需清理 D 该函数删除索引
# 58. 下划线命名(snake_case)与驼峰命名(camelCase)的 SQL 业界惯例? A PG 中 camelCase 无需引号 B camelCase 是 SQL 惯例 C 大小写无影响 D SQL 业界惯例用 snake_case 全小写,避免大小写歧义,camelCase 需引号易出错 ✓ 正确答案
# 59. 约束命名,chk_t_col、uk_t_col、pk_t 的可读性? A 用 pk/fk/uk/chk 前缀命名约束,提升可读性与错误定位 ✓ 正确答案 B 约束命名无意义 C 约束名不能加前缀 D 约束命名与错误定位无关