面试题答案
一键面试数据库设计层面
- 合理设计表结构:
- 减少关联复杂性:避免设计过于复杂的表关联关系,尽量将大的关联查询拆分成多个较小的查询。例如,在多对多关系中,如果可以通过中间表将复杂的直接关联简化,能减少锁争用范围。原理是减少了事务在获取锁时涉及的对象数量,降低死锁可能性。可能影响是查询复杂度增加,需要更多的代码逻辑来处理多个小查询。
- 适当冗余字段:在不违反数据一致性原则下,适当增加冗余字段。比如在一些需要关联多个表获取数据的场景中,在常用查询的表中冗余部分字段。这样在查询时可以减少跨表操作,降低锁争用。原理是减少了锁的获取范围。但可能带来数据一致性维护成本增加的问题,需要在更新时同时更新冗余字段。
- 优化索引设计:
- 创建合适索引:分析业务查询需求,为频繁查询条件创建索引。例如,对于
WHERE
子句中常用的字段创建索引,能加速查询,减少事务持有锁的时间。原理是快速定位数据,减少锁等待时间。可能影响是索引占用额外存储空间,且插入、更新操作可能变慢,因为需要同时更新索引。
- 创建合适索引:分析业务查询需求,为频繁查询条件创建索引。例如,对于
事务管理层面
- 事务隔离级别调整:
- 选择合适隔离级别:根据业务需求,适当降低事务隔离级别。例如,从默认的
REPEATABLE READ
调整为READ COMMITTED
。在READ COMMITTED
级别下,事务只能读取已提交的数据,减少了锁的持有时间。原理是减少了锁的粒度和持有时长。但可能带来脏读、不可重复读等数据一致性问题,需要业务能容忍这些情况。
- 选择合适隔离级别:根据业务需求,适当降低事务隔离级别。例如,从默认的
- 事务大小控制:
- 避免长事务:将大事务拆分成多个小事务。例如,在一个涉及多个业务操作的事务中,将可以独立的部分拆分成单独事务。原理是减少单个事务持有锁的时间和范围,降低死锁概率。但可能导致业务逻辑复杂性增加,需要处理事务间的数据一致性和依赖关系。
- 事务执行顺序:
- 制定统一顺序:对于涉及多个表操作的事务,在整个应用中制定统一的操作顺序。比如在更新多个表时,所有事务都先更新表A,再更新表B。原理是避免不同事务因操作顺序不同导致的死锁。可能影响是对开发规范要求更高,需要所有开发人员遵循统一顺序。
SQL 语句优化层面
- 语句执行顺序优化:
- 减少锁等待时间:在SQL语句中,尽量先获取最可能产生锁争用的资源。例如,在多表更新中,先更新锁竞争大的表。原理是让事务尽快获取关键资源锁,减少等待造成死锁的可能性。可能影响是对业务逻辑和数据依赖分析要求高,需准确判断锁争用情况。
- 优化查询逻辑:
- 避免不必要查询:检查SQL语句,去除不必要的子查询或复杂计算。例如,将复杂的子查询优化为连接查询,减少中间结果集生成。原理是减少事务执行时间,从而减少锁持有时间。可能影响是对SQL编写技巧要求更高,需要深入理解数据库执行计划。