面试题答案
一键面试系统架构层面
- 合理设计表结构
- 范式与反范式结合:
- 范式设计:遵循范式规则(如第一范式确保每列原子性,第二范式消除部分依赖,第三范式消除传递依赖),减少数据冗余,在数据一致性要求高、写操作频繁场景适用,如银行转账记录等业务场景。例如,将客户信息表和订单表分开,避免客户信息在订单表中重复存储。
- 反范式设计:适当增加冗余字段,减少表连接操作,提升读性能。适用于读多写少场景,如论坛帖子展示,在帖子表中冗余作者部分信息,避免每次查询都连接用户表。
- 字段类型选择:
- 尽量使用固定长度数据类型(如
CHAR
比VARCHAR
在某些场景更高效,适合长度固定且较短的字段,如性别字段CHAR(1)
),减少存储碎片,提升存储效率。 - 对于数值类型,根据实际取值范围选择最小合适类型,如年龄字段用
TINYINT
(0 - 255范围),避免使用大类型浪费空间。
- 尽量使用固定长度数据类型(如
- 范式与反范式结合:
- 选择合适的存储引擎
- InnoDB:
- 适用场景:适用于事务处理应用程序,支持行级锁,适合高并发读写场景,如电商订单处理系统。
- 优化策略:合理设置
innodb_buffer_pool_size
,建议设置为物理内存的60% - 80%,用于缓存数据和索引,减少磁盘I/O。例如,在一台16GB内存的服务器上,可设置为10GB左右。
- MyISAM:
- 适用场景:适合读密集型应用,如日志记录系统,不支持事务和行级锁,但表级锁开销小,在查询为主且并发写操作少场景表现较好。
- 优化策略:可适当增大
key_buffer_size
,用于缓存索引块,提升查询性能。
- InnoDB:
底层原理层面
- 索引优化
- 创建合适索引:
- 对经常用于
WHERE
子句、JOIN
子句中的列创建索引。例如,在SELECT * FROM users WHERE age > 30;
语句中,对age
列创建索引可提升查询速度。 - 复合索引要遵循最左前缀原则,如复合索引
(col1, col2, col3)
,在查询条件为col1 = 'value1' AND col2 = 'value2'
时能有效利用索引。
- 对经常用于
- 索引维护:定期使用
ANALYZE TABLE
语句更新索引统计信息,使查询优化器能生成更优执行计划。例如,在数据大量插入或删除后执行该语句。
- 创建合适索引:
- 日志机制优化
- InnoDB日志:
innodb_flush_log_at_trx_commit
参数控制日志刷新策略:- 设置为0,每秒将日志缓冲区数据写入日志文件并刷盘,性能最高但可能丢失1秒数据,适用于允许一定数据丢失的非关键业务,如论坛帖子浏览计数。
- 设置为1(默认值),每次事务提交时将日志缓冲区数据写入日志文件并刷盘,数据安全性最高但性能相对较低,适用于金融交易等对数据一致性要求极高的场景。
- 设置为2,每次事务提交时将日志缓冲区数据写入日志文件,但每秒刷盘一次,性能和数据安全性介于0和1之间,适用于一般业务场景。
- 二进制日志:
- 合理设置
sync_binlog
参数,0表示由操作系统决定何时将二进制日志刷盘,性能较高但崩溃时可能丢失部分日志;1表示每次事务提交都刷盘,数据安全性高但性能有影响。根据业务对数据安全性和性能要求权衡设置。
- 合理设置
- InnoDB日志:
日常运维层面
- 定期性能监控与调优
- 使用
SHOW STATUS
命令监控数据库状态,如Innodb_buffer_pool_reads
(缓冲池读次数)、Innodb_buffer_pool_pages_free
(缓冲池空闲页数)等指标,判断缓冲池是否充足。若Innodb_buffer_pool_reads
过高,可适当增大innodb_buffer_pool_size
。 - 利用
EXPLAIN
关键字分析查询语句执行计划,查看索引使用情况、表连接顺序等,对执行计划不佳的查询进行优化。例如,若发现全表扫描,可考虑添加合适索引。
- 使用
- 数据备份与恢复策略优化
- 冷备份:在数据库关闭状态下进行备份,适用于数据量较小且对停机时间可接受的场景。优点是简单可靠,缺点是影响业务正常运行。
- 热备份:使用
mysqldump
工具(结合--single - transaction
选项)或XtraBackup
工具进行热备份,适用于对业务连续性要求高的场景。例如,XtraBackup
可在不停止数据库的情况下进行备份,且支持增量备份,减少备份时间和空间消耗。 - 恢复策略:定期进行恢复演练,确保备份数据可用。根据不同故障场景(如数据文件损坏、误删除等)制定相应恢复流程,减少故障恢复时间。