面试题答案
一键面试系统架构层面
- 读写分离优化:
- 更细致地划分读操作,将一些实时性要求不高的读请求(如商品详情页展示历史订单统计等)更多地导向备库,减轻主库读压力,让主库能更专注于写操作。同时,对于实时性要求高的读(如用户刚下单后的订单详情查询)仍从主库读取。
- 引入缓存层(如Redis),对于频繁读取且不经常变化的数据(如商品基本信息等)先从缓存读取,减少对数据库(包括主库和备库)的读压力。
- 增加备库数量:
- 根据业务流量和备库延迟情况,适当增加备库数量。将读请求均匀分配到多个备库上,降低单个备库的负载,从而减少延迟。可以使用负载均衡器(如Nginx、HAProxy等)来实现对多个备库的读请求分发。
- 分库分表:
- 对于订单表和库存表,如果数据量巨大,可以进行分库分表。例如按订单时间或用户ID对订单表进行水平分表,按商品类别或仓库对库存表进行分库分表。这样可以减少单个表的数据量,提高数据库操作效率,主库操作更快完成,备库同步也会更及时。
SQL语句优化层面
- 索引优化:
- 对于订单创建和库存更新涉及的表,确保相关字段都有合适的索引。例如订单表中的用户ID、订单时间等字段,库存表中的商品ID、仓库ID等字段。合理的索引能加快主库写操作和备库同步时的读操作速度。但要注意避免索引过多,因为过多索引会增加写操作的开销。
- 查询语句优化:
- 检查主库执行的SQL语句,确保没有复杂的嵌套子查询、全表扫描等低效操作。例如在库存更新时,尽量使用高效的UPDATE语句,避免使用多个关联查询来更新库存。可以通过执行计划分析(如使用EXPLAIN关键字)来找出SQL语句的性能瓶颈并进行优化。
- 批量操作:
- 在订单创建和库存更新时,尽量使用批量操作。例如批量插入订单数据,而不是单个插入;批量更新库存,减少数据库事务的次数,提高主库操作效率,进而减少备库延迟。
MySQL参数配置层面
- 主库参数:
- sync_binlog参数:可以适当调整sync_binlog的值,默认值为1,表示每次事务提交时都将二进制日志同步到磁盘。如果业务能容忍一定的数据丢失风险,可以将其设置为大于1的值(如100或1000),这样可以减少磁盘I/O次数,提高主库写性能,但会增加数据丢失的可能性。
- innodb_flush_log_at_trx_commit参数:该参数控制InnoDB存储引擎将日志缓冲区中的日志写入磁盘并同步的时机。默认值为1,即每次事务提交时都进行写入和同步。如果能接受一定的数据丢失风险,可以设置为2,每秒将日志写入磁盘并同步,或设置为0,由操作系统决定何时同步,从而提高主库性能。
- 备库参数:
- slave_parallel_workers参数:从MySQL 5.6开始支持并行复制,通过设置该参数,可以指定备库并行复制的线程数。根据备库服务器的CPU核数等资源情况,合理设置该参数(如设置为CPU核数的一半),提高备库并行复制的效率,减少延迟。
- relay_log_recovery参数:设置为1,当备库重启时,自动从中继日志的最后一个有效位置继续复制,避免因中继日志损坏等问题导致的复制中断,保证备库持续同步,减少延迟。