主题
面试速答(先看这里)
**一句话结论:**一般来说不需要,因为大部分公司是不允许删除字段的,DDL变更也必须要向下兼容,所以不太需要这个开关。
60秒标准回答:
一般是先执行DDL变更,比如增加索引,或者新增字段,要先把DDL变更发布了,然后再发布代码,这样的话不会有报错,如果先发布代码,会因为DDL未变更导致字段找不到的问题
一般来说不需要,因为大部分公司是不允许删除字段的,DDL变更也必须要向下兼容,所以不太需要这个开关
如果是不兼容变更,那么就可以做个开关,但是这样的话代码就很复杂。。。不建议
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **项目发布的时候,是先升级程序,还是先执行ddl的sql:**一般是先执行DDL变更,比如增加索引,或者新增字段,要先把DDL变更发布了,然后再发布代码,这样的话不会有报错,如果先发布代码,会因为DDL未变更导致字段找不到的问题。
- **要不要做个开关,来兼容ddl的sql变更:**一般来说不需要,因为大部分公司是不允许删除字段的,DDL变更也必须要向下兼容,所以不太需要这个开关。
- **超大表的ddl的sql执行,需要注意什么?:**不要在业务高峰期执行,因为虽然MySQL 5.6中支持ONLINE DDL了,DDL过程中不会锁表了。
- **在Spring Boot中,使用JPA来自动更新数据库表结构,推荐吗?:**在生产环境中,直接使用 ddl-auto=update 存在风险。
**记忆锚点:**DDL → ddl → sql → ddl-auto → update → JPA
关键取舍:
- 但是Online DDL 在执行过程中会占用系统资源,如 CPU、内存和 I/O。
- 这可能会对数据库的性能产生一定影响,尤其是在数据量较大的情况下。
- 复杂的表结构变更(如字段重命名、大规模数据迁移、索引变更等)可能会引发数据丢失或性能问题。
易错提醒:
- 要不要做个开关,来兼容ddl的sql变更 一般来说不需要,因为大部分公司是不允许删除字段的,DDL变更也必须要向下兼容,所以不太需要这个开关。
- 不建议 超大表的ddl的sql执行,需要注意什么?
加分表达:
- 项目发布的时候,是先升级程序,还是先执行ddl的sql 一般是先执行DDL变更,比如增加索引,或者新增字段,要先把DDL变更发布了,然后再发布代码,这样的话不会有报错,如果先发布代码,会因为DDL未变更导致字段找不到的问题。
- 如果是不兼容变更,那么就可以做个开关,但是这样的话代码就很复杂。
追问准备:
- 不建议 超大表的ddl的sql执行,需要注意什么?
- 在Spring Boot中,使用JPA来自动更新数据库表结构,推荐吗?
典型回答
项目发布的时候,是先升级程序,还是先执行ddl的sql
一般是先执行DDL变更,比如增加索引,或者新增字段,要先把DDL变更发布了,然后再发布代码,这样的话不会有报错,如果先发布代码,会因为DDL未变更导致字段找不到的问题。
要不要做个开关,来兼容ddl的sql变更
一般来说不需要,因为大部分公司是不允许删除字段的,DDL变更也必须要向下兼容,所以不太需要这个开关。
如果是不兼容变更,那么就可以做个开关,但是这样的话代码就很复杂。。。不建议
超大表的ddl的sql执行,需要注意什么?
不要在业务高峰期执行,因为虽然MySQL 5.6中支持ONLINE DDL了,DDL过程中不会锁表了。但是Online DDL 在执行过程中会占用系统资源,如 CPU、内存和 I/O。这可能会对数据库的性能产生一定影响,尤其是在数据量较大的情况下。
在Spring Boot中,使用JPA来自动更新数据库表结构,推荐吗?
那肯定是不推荐啊!
在生产环境中,直接使用 ddl-auto=update 存在风险。复杂的表结构变更(如字段重命名、大规模数据迁移、索引变更等)可能会引发数据丢失或性能问题。
使用 ddl-auto=update 时,数据库变更的历史没有被记录下来,难以追踪变更的具体原因和执行时间。这对于维护和调试会带来困难。
有些变更(如外键关系的修改、大规模数据迁移、触发器等)无法通过 JPA 的自动更新来完成,需要手动编写 DDL 脚本。