面试题答案
一键面试数据库架构设计
- 合理设计表结构
- 避免过度范式化或反范式化。过度范式化可能导致表关联过多,影响写入性能;反范式化则要控制冗余字段,防止数据不一致。例如,对于一些经常一起查询且变化频率较低的字段,可以适当冗余到同一表中,减少关联操作,但要注意更新逻辑的一致性。
- 对大表进行分表,水平分表可以按照时间、ID范围等规则将数据分散到不同表中,减少单表数据量,降低索引维护成本。例如,按月份对订单表进行水平分表,每个月的数据在独立表中,索引维护的压力也相应分散。
- 使用合适的存储引擎
- InnoDB是MySQL常用的存储引擎,适合高并发写入场景,它支持事务和行级锁。相比MyISAM的表级锁,行级锁能减少锁争用,提高并发写入性能。例如,在电商订单系统中,大量订单写入时,InnoDB存储引擎能更好地应对并发操作。
索引优化策略
- 索引清理
- 定期使用
SHOW INDEX FROM table_name
命令查看表中的索引信息,识别冗余和重复索引。冗余索引是指包含了另一个索引的所有列且顺序相同,或者包含了主键列的情况。例如,如果有索引(col1, col2)
,而另一个索引(col1, col2, col3)
,后者就是冗余索引(在大部分查询场景下),可以删除。 - 使用
EXPLAIN
关键字分析SQL查询语句,观察索引的使用情况。如果发现某些索引从未被使用,可以考虑删除,以减少索引维护开销。
- 定期使用
- 优化索引结构
- 采用前缀索引,对于较长的字符串字段,可以只对字段的前几个字符建立索引,这样能减少索引存储空间和维护成本,同时在一定程度上提高查询性能。例如,对于长文本的商品描述字段,对前10 - 20个字符建立前缀索引,可满足部分查询需求。
- 组合索引要遵循最左前缀原则,将选择性高(区分度大)的字段放在组合索引的前面,以提高索引的利用率。比如,在用户表中,
(gender, age)
组合索引,如果查询条件经常是按性别过滤,那么gender
应放在前面。
事务处理
- 控制事务粒度
- 避免大事务,将大事务拆分成多个小事务。大事务在执行过程中会持有锁的时间较长,增加锁争用的概率,影响并发写入性能。例如,在批量插入数据时,将一次插入大量数据的操作拆分成多次小批量插入,每次插入作为一个独立事务,这样能更快释放锁资源。
- 优化事务隔离级别
- 根据业务需求合理选择事务隔离级别。默认的
REPEATABLE READ
隔离级别能防止不可重复读,但会增加锁的开销。如果业务场景允许一定程度的脏读或不可重复读,可以选择较低的隔离级别,如READ COMMITTED
,以减少锁争用,提高并发写入性能。不过在选择较低隔离级别时,要充分评估业务影响,确保数据的一致性和正确性。
- 根据业务需求合理选择事务隔离级别。默认的