常见八股面试题:用过 MySQL 读写分离吗?怎么做的?

MySQL读写分离实践

大家好,我是鸭鸭!

此答案节选自鸭鸭最近弄的面试鸭刷题神器面试鸭,更多大厂常问面试题,可以点击进行阅读哈!

目前这个面试刷题神器刚出,有网页和小程序双端可以使用!


回归面试题!用过 MySQL 读写分离吗?怎么做的?

什么是读写分离

1)读写分离就是读操作和写操作从以前的一台服务器上剥离开来,将主库压力分担一些到从库。

本质上是因为访问量太大,主库的压力过大,单机数据库无法支撑并发读写。

然后一般而言读的次数远高于写,因此将读操作分发到从库上,这就是常见的读写分离。

2)读写分离还有个操作就是主库不建查询的索引,从库建查询的索引。

因为索引是需要维护的,比如你插入一条数据,不仅要在聚簇索引上面插入,对应的二级索引也得插入,修改也是一样的。

所以将读操作分到从库了之后,可以在主库把查询要用的索引删了,减少写操作对主库的影响。

怎么做的

做法一:代码封装

讲白了就是代码层面抽出一个中间层,由中间层来实现读写分离和数据库连接。

就是搞了个代理类,对外暴露正常的读写接口,里面封装了逻辑,将读操作指向从库的数据源,写操作指向主库的数据源。

  • 优点:简单,并且可以根据业务定制化变化,随心所欲。
  • 缺点:如果数据库宕机了,发生主从切换了之后,就得修改配置重启。如果系统是多语言的话,需要为每个语言都实现一个中间层代码,重复开发。
做法二:使用中间件

一般而言是独立部署的系统,客户端与这个中间件的交互是通过 SQL 协议的。

在这里插入图片描述

所以在客户端看来连接的就是一个数据库,通过 SQL 协议交互也可以屏蔽多语言的差异。

缺点就是整体架构多了一个系统需要维护,并且可能成为性能瓶颈,毕竟交互都需要经过它中转。

常见的开源数据库中间件有:官方的 MySQL-Proxy、360 的 Atlas、ShardingSphere、Mycat 等。

最后

最后再推荐下鸭鸭目前努力在做面试刷题神器面试鸭,已经有 3000 多道面试题目啦,欢迎大家来阅读!如果大家有不会的面试题,也可以在面试鸭内反馈!鸭鸭会第一时间为大家解答!

我是鸭鸭,我们下期见~

### 常见MySQL 面试题及答案解析 #### 数据库基础概念 1. **什么是关系型数据库?** 关系型数据库是一种基于表格形式存储数据的数据库系统,其中数据以行和列的形式组织。MySQL 是一种非常流行的关系型数据库管理系统[^1]。 2. **MySQL 中的主键和外键有什么区别?** 主键用于唯一标识表中的每一行记录,而外键则用来建立两个表之间的关联关系。主键不允许为空值 (NULL),而外键可以接受 NULL 值。 3. **什么是事务?MySQL 如何支持事务?** 事务是一组 SQL 操作单元,要么全部执行成功,要么全部失败回滚。MySQL 使用 InnoDB 存储引擎来支持事务功能。 #### 性能调优与查询优化 4. **如何定位并优化 SQL 查询性能问题?** 可以通过 `EXPLAIN` 来分析查询计划,查看是否有合适的索引被使用;还可以利用慢查询日志 (`slow_query_log`) 找出耗时较长的查询语句,并对其进行针对性优化[^2]。 5. **创建的索引是否真正被使用到了?** 利用 `EXPLAIN SELECT ...` 或者 `SHOW INDEX FROM table_name;` 查看具体查询中使用的索引情况。如果发现未命中预期索引,则可能需要调整设计或者重建更有效的复合索引。 6. **从 Unix 时间戳转换为 MySQL 时间戳应使用什么函数?** 应当采用内置函数 `FROM_UNIXTIME()` 将 Unix 时间戳转化为标准日期时间格式。 #### 备份与恢复策略 7. **怎样完成一次完整的 MySQL 数据库备份及其后续恢复过程?** 如果是逻辑备份方式(如mysqldump),可以通过如下命令导出整个数据库: ```bash mysqldump -u username -p database_name > backup_file.sql ``` 而导入时只需运行下面指令即可还原至目标实例上: ```bash mysql -u username -p database_name < backup_file.sql ``` 对于物理备份方案而言,通常涉及全量加增量模式组合运用——即先做一份冷备快照再配合 binlog 日志重放机制达成最终一致性效果[^3]。 8. **在高并发环境下,MySQL 的挑战有哪些解决方案?** 在面对大量请求涌入的情况下,可通过分片技术减少单机负载压力;另外引入读写分离架构也能有效缓解热点资源争抢现象;除此之外还有缓存层前置减轻后台计算负担等多种手段可供选择实施。 ```sql -- 示例代码展示 EXPLAIN 工具的应用 EXPLAIN SELECT * FROM orders WHERE order_date >= '2023-01-01'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值