面试数据库八股文十问十答第九期
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)MySQL 读写分离
MySQL 读写分离是指将读操作和写操作分别分配到不同的数据库实例上,以提高数据库的读取性能和可用性。一般的做法是:
- 配置主从复制:将主数据库(用于写操作)与多个从数据库(用于读操作)进行配置。
- 读写分离代理:在应用程序和数据库之间部署读写分离代理,如 MySQL Proxy、ProxySQL 等,用于拦截数据库请求并将读操作转发到从数据库,写操作转发到主数据库。
- 负载均衡:使用负载均衡器来分发读操作请求到不同的从数据库,以平衡数据库负载。
- 监控和管理:实时监控数据库实例的健康状态,确保主从同步正常,及时处理异常情况。
2)MySQL 主从同步机制
MySQL 主从同步是指将主数据库的数据变更同步到从数据库,以保持数据一致性。主从同步机制包括以下步骤:
- binlog 日志:主数据库记录所有的数据变更操作到二进制日志(binlog)中。
- relay log 日志:从数据库通过主数据库的 binlog 日志进行数据同步,将数据变更操作记录到自己的中继日志(relay log)中。
- IO 线程:从数据库的 IO 线程从主数据库读取 binlog 日志,并将数据写入自己的 relay log 日志中。
- SQL 线程:从数据库的 SQL 线程从 relay log 日志中读取数据变更操作,并在本地执行,保持数据的一致性。
3)主从同步延迟处理
主从同步可能会出现延迟,主要原因包括网络延迟、从数据库负载过高等。处理主从同步延迟可以采取以下方法:
- 监控延迟:实时监控主从同步延迟,及时发现延迟情况。
- 优化网络:优化网络连接,减少网络延迟,可以考虑使用专线或者增加带宽。
- 调整参数:调整 MySQL 参数,如增大 binlog 大小、调整复制线程参数等,以提高同步效率。
- 增加从库:增加从数据库实例,将读操作分散到多个从数据库上,减少单个从数据库的负载压力。
- 重放 binlog:如果从库同步延迟严重,可以考虑暂停从库的同步,重新生成主库上的 binlog,并在从库上重放 binlog,以快速恢复数据一致性。
这些方法可以帮助处理主从同步延迟问题,确保数据库的数据一致性和可用性。
4)分库分表的理解
- 分库:将一个数据库中的数据按照一定规则划分到多个数据库中,每个数据库负责存储一部分数据。
- 分表:将一个表中的数据按照一定规则划分到多个物理表中,每个物理表负责存储一部分数据。
分库分表的主要目的是提高数据库的性能和扩展性,通过水平拆分数据,减少单个数据库或表的负载,提高系统的并发处理能力和可用性。
5)分库分表的实施方式
分库分表的实施方式可以根据具体业务需求和数据特点来确定,一般包括以下几个步骤:
- 数据分片规则设计:根据业务需求设计合适的数据分片规则,如按照用户 ID、地理位置、时间等进行分片。
- 分库策略:根据分片规则将数据分散到多个数据库中,一般采用水平分库的方式。
- 分表策略:根据分片规则将数据分散到多个物理表中,一般采用水平分表或者垂直分表的方式。
- 数据迁移和同步:将现有数据按照分片规则进行迁移,确保数据分布到各个库表中,并设置数据同步机制,保持数据的一致性。
6)分表带来的问题
尽管分表可以提高数据库的性能和扩展性,但也会带来一些问题,包括但不限于:
- 查询复杂性增加:分表后,对跨表查询和聚合查询的支持会变得更加复杂,需要设计合适的查询方式来处理分布在不同表中的数据。
- 事务管理困难:跨表事务管理会变得更加复杂,需要设计合适的事务管理策略来保证事务的一致性。
- 数据迁移和维护成本增加:分表后,数据迁移和维护的成本会增加,需要设计合适的数据迁移和维护策略来保证系统的稳定性和可用性。
- 分片平衡:分表后,可能会出现分片不均衡的情况,需要设计合适的分片策略来保证各个分片的负载均衡。
解决这些问题需要综合考虑业务需求和数据库特点,设计合适的分库分表方案,并配合合适的技术方案来实施和管理。
7)从 MySQL 获取数据,是从硬盘读取的吗?
MySQL 在获取数据时,其读取数据的来源取决于数据是否在内存中的缓存(例如缓存池)。一般情况下,数据首次读取会来自硬盘。一旦被访问,数据将被加载到内存中的缓存区,如 InnoDB 的缓冲池。之后的访问可能直接从内存中读取,大大加快了数据访问速度。但如果内存中没有找到所需数据,MySQL 将从硬盘中读取。
8)MySQL change buffer
MySQL 的 change buffer 是 InnoDB 存储引擎的一个特性,用于优化非唯一索引下的数据插入、删除和修改操作。当对一个非唯一索引的表执行写操作时,如果相关的数据页不在缓冲池中,InnoDB 会使用 change buffer 来记录这些更改,而不是立即从硬盘读取数据页进行更新。这减少了磁盘 I/O 的需求,并提高了性能。在后续的数据页被加载到缓冲池时,这些更改会被合并(merge)到数据页中。
9)MySQL Doublewrite Buffer
MySQL 的 Doublewrite Buffer 是 InnoDB 存储引擎用来防止部分写损坏(partial page writes)的一种机制。在将数据页写入磁盘之前,InnoDB 首先将它们写入到一个称为 doublewrite buffer 的特殊区域。这个缓冲区位于共享表空间内,InnoDB 会将每个数据页写两次(一次到 doublewrite buffer,一次到最终位置)。如果在写入过程中发生崩溃,InnoDB 可以从 doublewrite buffer 恢复完整的数据页,确保数据的一致性和完整性。
10)MySQL Log Buffer
MySQL 的 Log Buffer 是 InnoDB 存储引擎用于缓存即将写入 redo log 的数据修改信息的内存区域。当事务提交时,事务中的修改首先记录在 Log Buffer 中。这些日志信息随后异步写入到磁盘上的 redo log 文件中。Log Buffer 的使用减少了磁盘 I/O,因为它允许系统合并多个事务日志的写入操作。如果数据库突然崩溃,redo log 保证了事务的持久性,可以在重启后使用 redo log 来重放这些修改,恢复到崩溃前的状态。
这些内部机制共同提高了 MySQL 的性能,同时确保了数据的完整性和持久性。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 1300+ Star,2W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐