命名规范与 B-tree/GIN 索引

共 60 题
#

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 影响空间索引
#

54. GiST 与 GIN 的差异?

A GiST 是搜索树适合空间/范围,GIN 是倒排索引适合多值/全文 ✓ 正确答案
B 两者都是倒排索引
C GiST 适合多值
D GIN 适合空间
#

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 约束命名与错误定位无关
#

60. 表名复数 vs 单数?

A 必须用单数
B 必须用复数
C 复数/单数无绝对标准,关键是全库统一并符合 ORM 约定 ✓ 正确答案
D 表名风格不影响一致性