日期:2026-07-11
难度:中等
标签:#面试 #MySQL #视图 #数据库设计 #VIP
一句话答案
视图是由查询定义的虚拟表,通常只保存查询定义而不独立保存结果,可用于封装复杂 SQL、统一数据口径和限制用户可见的行列。
面试口语版
创建视图后,业务可以像查询表一样查询它,但普通 MySQL VIEW 不是物化视图,结果一般在访问时根据基表计算。它适合封装重复 JOIN、统一字段命名、兼容旧接口,或只暴露脱敏后的列。视图不是性能优化银弹,复杂视图嵌套可能让执行计划难读,底层表变化也可能使视图失效。部分简单单表视图可以更新,但包含聚合、DISTINCT、GROUP BY、UNION 等的视图通常不可更新。
原理拆解
CREATE VIEW active_users AS
SELECT id, name
FROM users
WHERE status = 'ACTIVE';
SELECT * FROM active_users WHERE id = 1;
关键细节
ALGORITHM可为 MERGE、TEMPTABLE 或 UNDEFINED,影响查询合并与可更新性。SQL SECURITY DEFINER/INVOKER决定按定义者还是调用者权限执行,需防止权限扩大。- MySQL 原生普通视图不缓存结果;需要物化效果时通常用汇总表和定时/增量刷新。
面试官追问
- 视图和表的区别?
- 哪些视图可以更新?
- 视图能提高查询性能吗?
- DEFINER 有什么安全风险?
高分补充
视图更适合做稳定数据接口和权限边界,而不是掩盖不可控的复杂 SQL。
学习清单
- 记住虚拟表、非物化、可更新条件和安全上下文。