JSON、生成列与数据库对象
这部分不是所有项目都会用,却很容易成为面试中的能力边界题。原则是:数据库能做不代表都该放进数据库,选择要围绕约束、查询成本和可维护性。
JSON
create table products (
id bigint primary key auto_increment,
attributes json not null,
check (json_valid(attributes))
);
select id,
attributes->>'$.brand' as brand
from products
where attributes->>'$.color' = 'red';JSON 适合结构变化快、低频检索的扩展属性。主键、金额、状态、关联键等稳定核心字段仍应关系化,以获得类型、约束、索引、统计信息和清晰的数据治理。
生成列与 JSON 索引
alter table products
add column brand varchar(64)
generated always as (attributes->>'$.brand') stored,
add index idx_brand (brand);virtual生成列读取时计算,通常不存储列值。stored生成列写入时计算并保存,占空间但读成本低。- MySQL 8 也支持符合条件的函数索引,仍需检查表达式、类型和版本限制。
全文索引
create fulltext index ft_article_title_content
on article(title, content);
select id, title
from article
where match(title, content)
against('+mysql +index' in boolean mode);全文索引适合中等规模和有限检索需求。中文分词、相关性、同义词、聚合、复杂高亮和大规模搜索通常要评估专用搜索引擎。普通 B+Tree 也不能高效解决任意前导模糊查询。
空间数据
MySQL 支持 geometry 类型、空间函数和空间索引。使用时必须明确 SRID 和坐标系:经纬度顺序、距离单位和投影错误会产生“SQL 正确但业务结果错误”。复杂 GIS 能力应与 PostGIS 等方案比较后选择。
视图
create view active_users as
select id, username
from users
where status = 1;普通视图主要封装查询,本身通常不保存结果,也不天然提升性能。嵌套复杂视图可能隐藏扫描和 Join 成本;权限隔离场景还要验证 SQL SECURITY 语义。
MySQL 没有与部分数据库完全等价的原生物化视图。预计算汇总通常通过汇总表、定时任务或流式计算维护。
存储过程、函数和触发器
存储过程适合靠近数据的批处理或遗留系统;触发器能在写入事件上执行逻辑。但复杂业务大量放入数据库会带来:
- 调用链隐蔽,应用代码看不到完整副作用。
- 版本管理、灰度、测试和可观测性更困难。
- 触发器延长原事务,并可能扩大锁与故障范围。
- 多数据库迁移成本增加。
因此核心业务通常优先放在 Service 层,数据库对象用于约束或确有收益的局部逻辑。
内置函数分类、NULL、日期时间、聚合、窗口、函数索引以及 create function 的完整内容见 MySQL 函数大全与性能边界。
查看对象:
show triggers;
show procedure status where db = database();
show function status where db = database();
show events;Event Scheduler
数据库事件可以定时执行 SQL,但要明确主从切换、重复执行、失败重试、时区和监控责任。关键任务通常更适合有审计、告警和分布式协调能力的调度平台。
临时表
显式临时表只在当前会话可见,连接关闭后删除:
create temporary table tmp_ids (
id bigint primary key
);优化器也会为排序、分组、distinct、部分 CTE 等创建内部临时表。超过阈值或包含不适合内存的列时可能落盘。排查要看执行计划和临时表状态指标,不能把所有 Using temporary 都视为故障。
面试选择题思路
扩展属性该拆列还是用 JSON
看稳定性与访问模式。经常过滤、排序、关联、约束的字段拆成正式列;结构多变且主要整体读写的属性可用 JSON。对少数 JSON 路径检索时可建立生成列或函数索引,但要评估写入和维护成本。
为什么不建议滥用触发器
触发器在原事务中隐式执行,会增加响应时间、锁范围和排障难度;应用和调用方难以看到副作用。若使用,必须保持逻辑短小、幂等可测,纳入 DDL 版本管理并监控失败。
