面试题答案
一键面试数据库设计
- 合理设计表结构:避免在同一张表中设置过多字段,减少数据量,降低锁争用的可能性。例如,对于一些不常用且占用空间大的字段,可以考虑拆分到另外的表中。
- 优化索引:
- 创建合适的索引:确保查询条件中的字段有索引,避免全表扫描,减少锁的持有时间。例如,在经常用于
WHERE
子句过滤的字段上创建索引。 - 避免过度索引:过多的索引会增加维护成本,且在插入、更新操作时会导致更多的锁争用。只保留必要的索引。
- 创建合适的索引:确保查询条件中的字段有索引,避免全表扫描,减少锁的持有时间。例如,在经常用于
事务处理
- 减少事务粒度:将大事务拆分成多个小事务,每个小事务执行较短时间,减少锁的持有时间。例如,原本一个涉及多步复杂操作的大事务,可以根据业务逻辑拆分成几个独立的小事务依次执行。
- 优化事务隔离级别:根据业务需求选择合适的事务隔离级别。如果业务允许,可适当降低隔离级别,如从
SERIALIZABLE
降低到READ COMMITTED
,减少锁的使用。但要注意可能带来的脏读、不可重复读等问题。 - 按相同顺序访问资源:在多个事务中,如果需要访问多个相同资源,保证按相同顺序访问,避免死锁,减少锁升级的风险。例如,多个事务都要访问表A和表B,都先访问表A再访问表B。
SQL语句编写
- 批量操作:尽量使用批量
INSERT
、UPDATE
、DELETE
语句,减少锁的获取次数。例如,将多次单条插入操作合并为一次批量插入。 - 避免不必要的锁:在
SELECT
语句中,避免使用SELECT... FOR UPDATE
这种显式加锁语句,除非确实有必要。如果只是查询数据不涉及数据修改,尽量不要加锁。 - 优化查询语句:编写高效的查询语句,减少查询时间,从而减少锁的持有时间。例如,避免使用子查询嵌套过深,合理使用
JOIN
操作等。