一文搞懂后端面试之数据库综合应用【中间件 | 数据库 | MySQL | 高可用 | 高性能】

news2024/11/17 3:48:02

查询缓存

在MySQL里面,允许用户开启查询缓存。你可以理解这个缓存就是用SQL作为键,而对应的查询结果集就是值。如果下次过来的还是同一个查询,那么就直接返回缓存起来的查询结果集。
在这里插入图片描述
但是查询缓存不一定带来查询性能提升。如果你的查询每一次对应的SQL都不一样,那么查询缓存反而会降低性能。
在实践中查询缓存的效果的确不怎么好。按照设计者的想法,查询缓存的最佳使用场景是一些特别复杂的查询,他们会扫描很多行,但是只有一小部分行满足条件。所以MySQL在8.0的时候移除了这个功能。

面试准备

  • 后面的提到的参数是否还有改进的空间,记住公司里每一个使用了非默认值的参数
  • 如果公司有DBA,可以请教一下DBA,有没有针对公司的业务做过什么优化,包括数据库自身的优化,也包括数据库所在的操作系统的优化。
  • 如果文档比较齐全,可以了解一下数据库架构的演进
    同时,要为后面的查询优化、参数调优、读写分离和分库分表多准备一些案例。查询优化部分要多准备案例,案例要覆盖不同的优化方向,比如有优化索引的案例,也有优化锁的案例。
    参数调优部分在实践中是根据业务特征来选择优化方向,但是在面试的时候可以根据准备的回答来找业务特征,论证自身优化的合理性。
    读写分离部分就是看公司有没有用过读写分离,如果有的话,主从切换是手动还是自动。如果是自动的,弄清楚怎么自动切换。

还有分库分表,如果有机会亲身参与分库分表那自然是最好的。要是没有的话,就看看你所在公司是如何从单库演进到分库分表的。如果公司本身也没有分库分表,那么你就可以看看别的大厂发布出来的案例,从各个大厂的技术公众号里就能找到。

面试官问到哪些问题,你可以用这节课的内容来回答呢?

  1. 你是如何提升系统可用性或者性能的?
  2. MVCC 相关的问题,你可以说你调整过 redo log 的刷盘时机,然后进一步引申到你对数据库调优的其他方案。
  3. 读写分离或者分库分表相关问题,也和这节课的内容强相关。

最佳的面试策略,是把提高数据库可用性、性能作为你提高整个系统的可用性、性能的一环。

整体方案

在简历上:

我擅长数据库,包括查询优化、MySQL 和 InnoDB 引擎优化,熟练掌握 MySQL 高可用和高性能方案。

自我介绍

我在数据库方面有比较多的积累,比如说我长期负责公司的查询优化,提高 MySQL 的可用性和性能。也在公司推动过读写分离和分库分表,实践经验丰富。

具体项目

这个项目是我们公司的核心业务,我主要负责性能优化和提高系统可用性。在数据库上,我通过查询优化、参数优化和读写分离,提高了 20% 的查询性能。同时参与了一个核心业务数据库的分库分表,主要负责的是数据迁移和主键生成部分。

参数调优

在这里插入图片描述
innodb_flush_log_at_trx_commit 这个参数非常重要
再介绍一个能够提升数据库性能,并且适合在面试中使用的参数innodb_buffer_pool_size

innodb_buffer_pool_size

简单说就是 innodb 缓冲池的大小,用于缓存表和索引,也包括插入数据缓冲,增加这个值可以减少磁盘 IO。
在实践中应该尽可能调大这个参数。如果数据库所在的机器内存比较大,那么可以调整到整个内存的 70% 或者 75%。但是也要小心这个参数过大,物理内存不足,容易触发操作系统 swap。
可以把这个东西包装一下,变成你解决的一个 Bug

最开始我会想到调整 innodb_buffer_pool_size 是因为我发现数据库上的 swap 非常高。经过排查我发现是因为 innodb_buffer_pool_size 设置得偏大了。在内存不足的时候,操作系统就会触发 swap。 解决思路自然是调小一点,但是这样做要小心对业务的影响。实际上 innodb_buffer_pool_size 是逐步调整的,最后调整到原本数值的 70%,swap 就大幅减少了,而且查询性能也没什么变化。

你还可以进一步说明另外一个相关的参数 innodb_buffer_pool_instances。从图里你可以看到,要是整个 MySQL InnoDB 引擎内部只有一个缓冲池,所有查询都访问它,那么并发竞争会十分厉害
在这里插入图片描述
在这种情况下,可以考虑启动多个缓冲池实例,具体多少个就由 innodb_buffer_pool_instances 这个参数指定。显然这个数字越大,并发竞争就越小。
在这里插入图片描述
可惜 MySQL 有一些额外的限制,它要求在 innodb_buffer_pool_instances 大于 1 的情况下,innodb_buffer_pool_size 不能小于 1G。一般我建议在 8G 以内设置成 2 就可以,如果大于 8G 那么可以设置成 4
可以把 innodb_buffer_pool_size 和 innodb_buffer_pool_instances 放到一起说。

在解决了 innodb_buffer_pool_size 的 Bug 之后,我负责的系统数据库的相关设置,又发现了一个问题。我们有一个核心数据库,innodb_buffer_pool_size 超过了 8G,但是 innodb_buffer_pool_instances 居然还保持着 1,这显然是不合理的。所以这个我就把它调整成了 4,减少数据库 buffer pool 的并发竞争。

query_cache_min_res_unit

前面我们提到了查询缓存相关的知识,你可以从两个相反的角度来使用查询缓存案例。第一个角度是你认为查询缓存效果不好,所以你关掉了

我们公司有一个数据库,用的是比较古老的 MySQL 版本。在这个版本上开启了查询缓存。但是实际上效果不太好,因为这里存储的数据其实经常变动,所以缓存命中率一直很低。我索性就关掉了这个查询缓存,后来查询性能也基本没有什么损失。

第二个角度是你赞同使用查询缓存。这里可以用两个案例来说明,第一个案例是你开启了查询缓存。

我们在业务里面有一个关键查询,这个查询比较复杂,执行的时候会非常慢。但是我注意到这个查询对应的数据是很少变动的,于是我尝试开启了查询缓存。果然开启缓存之后,这个查询大部分情况下都命中了缓存,性能得到了很大的提升。

第二个案例是你调整了查询缓存的相关参数,最为常见的是调整 query_cache_min_res_unit。这个参数的默认值是 4KB。大部分情况下,4KB 都太大了,所以会有很多内存浪费。比如说结果集可能就一行,总共不到 1KB,它都给你分配了 4KB。

我们有一个数据库是开启了查询缓存的,但是 query_cache_min_res_unit 一直使用的是默认值 4KB。后来我仔细评估了一下相关业务的查询结果集大小,4KB 显然太大了,浪费了很多内存。所以我后面把它调整成了 1KB,还是能够满足大多数查询的需求。这样就能缓存更多查询的结果集,查询性能得到了提升。

在这个角度之下,你要小心面试官问你为什么 MySQL 8.0 移除了这个功能。答案也很简单,因为缓存功能适合那种耗时并且重复执行的查询,而实际上这一类的查询并不多。 另外一个理由是,数据库本身就容易成为性能瓶颈,那么完全可以让应用自己去做缓存,减轻数据库的负担

读写分离

如果你在小公司工作的话,这部分内容会比较适合你,因为正常中大型公司基本上都已经完成了读写分离。你可以这样介绍你的读写分离方案。

最开始我进公司的时候,就发现他们居然连读写分离都还没做,包括我们的核心数据库都没有,而且当我去看观测数据的时候就感觉核心数据库已经快要触及性能瓶颈了。于是我就在公司里面引入了从库。虽然只是准备了一个从库,但是大部分读请求落到从库上,主库的压力就小多了。引入读写分离机制,一方面可以提高了数据库的可用性,另一方面也提高了查询的性能。

在这里插入图片描述
有些时候面试官可能会追问你具体是怎么做的,这里我给出简要步骤。

  1. 准备一个从库。
  2. 改造业务,允许业务动态切换读主库还是读从库。
  3. 切换到读从库,看看是否有问题,如果有问题就立刻回滚。

回答的时候你就可以介绍这个简单方案,同时提出一个主从延迟问题

单库引入读写分离,并不是特别复杂。不过这个过程中要小心主从延迟问题。比如说原本有一个业务是在更新之后立刻读数据,那么就会读到更新后的值。但是如果修改成读从库,就可能还是会读到更新前的值,导致业务出错。在改造业务的过程中要小心这种场景。

在这里插入图片描述
你可以利用主从自动切换进一步刷亮点。主从自动切换是指当主库出现问题的时候,能够自动把某个从库提升成主库。
在这里插入图片描述
当然如果你们公司本身已经有了读写分离,那么你也可以直接使用这个亮点。

在实施了读写分离之后,最开始我们都是手动切换主库或者从库。但是万一主库在半夜出现了故障,那就不一定能够及时发现并且切换了。所以我们用 KeepAlived 做了一个简单的自动主从切换机制,然后在测试环境做过几次演练。

我了解到云服务本身就提供了这种自动切换功能,所以接入了一下。

如果没有自动故障处理机制,是很难达到非常高的可用性的。这个亮点你可以看作是这种理念在数据库这边的应用。

分库分表

  1. 为什么要分库分表?
  2. 分库分表中间件选型,你只需要回答你们公司使用的分库分表中间件的优缺点就可以了。如果你对分库分表中间件没有任何了解,那么无脑使用 ShardingSphere 也行
  3. 容量规划
  4. 数据迁移
  5. 分库分表键选择
  6. 主键生成策略,并且要能解释清楚这种决策的理由
  7. 分库分表之后的事务问题,包括在服务层面上解决事务,例如 TCC、SAGA,又或者依赖于分库分表中间件提供的策略,比如说延迟事务。
  8. 分库分表中一些特殊查询的处理,最主要的就是分页查询。

面试开始的时候你就可以聊聊你实际参与过里面的某个步骤。

我进我们公司的时候,刚好遇上了数据库性能瓶颈,所以我实际参与了我们公司的核心数据库的分库分表,我主要负责的是分库分表中的数据迁移和主键生成部分。

你根据自己实际情况和前面学习的成果来选择。这里说数据迁移和主键生成,是因为单纯从技术上来说它们俩更有竞争优势。不过要注意一点,你要做到对自己负责的部分了如指掌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口隔离原则

接口隔离原则 接口隔离原则就是客户端不应该依赖它不需要的接口,或者说类间的依赖关系应该建立在最小的接口上。 我们以搜索美女为例,设计了如下的类图: 源代码如下。美女及其实现类: 搜索程序及其子类源代码如下: 最…

0101中文乱码-BufferedImage-图片处理

文章目录 1、问题描述2 、电子证书生成3、中文乱码原因及修复4、思考 结语 1、问题描述 接手维护一个休闲赛事类项目,因为服务器到期,项目从云服务器迁移到本地服务器。 项目生成比赛,分为二人组、三人组等等的团体;比赛设置几个…

判断矩阵中的一致性检验是指什么

判断矩阵中的一致性检验通常指的是在层次分析法(Analytic Hierarchy Process, AHP)中,用于评估决策者在构造判断矩阵时的逻辑一致性。 在AHP中,决策者需要比较成对的因素,并为每对因素的相对重要性赋予一个数值&#…

什么是haproxy七层代理

一.负载均衡 1.1.什么是负载均衡 负载均衡:Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均 衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从…

DriftingBlues2靶机渗透测试

DriftingBlues2靶机 文章目录 DriftingBlues2靶机信息收集FTP渗透web渗透权限提升靶机总结 信息收集 nmap扫描得到21,22和80端口,其中21ftp协议可以使用匿名用户登录 使用目录扫描一下网站,得到了blog目录 FTP渗透 匿名用户登录进去,发现…

QT移除窗体的最大化和最小化按钮

效果 代码位置 代码 int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.setWindowFlags(w.windowFlags() & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint);w.show();return a.exec(); }

考研数学想考120,把李林880做到准确率80%以上够吗?

考研数学想考120,把880题做到正确率80%以上是不够的 因为最近几年的考研数学变化,很大,传统的背题型的备考方式已经没用了,而880题是这种模式的佼佼者,25版的880变动又很小,只加了40道比较综合的题目在每一…

python基础命令学习

1.Python基础知识 目录 1.Python基础知识1.1 变量及类型1.2 标识符与关键字1.3 输出与输入1.3.1格式化符号1.3.2转义字符1.3.3结束符1.3.4输入的特点 1.4 运算符1.4.1 算数运算符1.4.2 赋值运算符1.4.3 比较(即关系)运算符1.4.4 逻辑运算符 1.5 数据类型转换1.6 判断与循环语句…

【K8S系列】Kubernetes基础介绍

一、前言 搭建完k8s集群后,正式进入k8s相关知识点的理论了解。并结合官方文档逐步总结涉及k8s各类知识点,希望能对正在学习的或将要学习得到小伙伴有所帮助。 二、系统部署历程回顾 传统部署时代: 早期,各个组织是在物理服务器…

[python]uiautomation.WindowControl函数用法

Python UIAutomation 窗口控件 介绍 在本文中,我们将探讨Python UIAutomation库以及如何使用它来控制和自动化Windows应用程序。我们将介绍UIAutomation的基础知识及其功能,并提供代码示例来演示其用法。 什么是UI自动化? UIAutomation是一个…

Java中常用的设计模式

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程…

【机器学习】探索数据矿藏:Python中的AI大模型与数据挖掘创新实践

💖 前言:探索数据矿藏1. 📊数据获取与预处理:AI大模型的燃料1.1 🌐数据获取:多样性与规模并重1.2 🧹数据清洗与处理:提升数据质量1.3 🔍特征工程:挖掘数据的深…

稠密检索的规模艺术:模型、数据与性能的精准匹配

论文:https://arxiv.org/pdf/2403.18684代码:GitHub - jingtaozhan/DRScale机构:清华大学领域:稠密检索、Scaling Laws发表:SIGIR2024最佳论文 Abstract Scaling Laws已经在广泛的任务中被观察到,特别是在…

JavaScript基础——闭包

闭包简介 闭包的作用 闭包可以保留变量的状态 闭包可以让变量私有化 闭包的缺点 闭包简介 在JavaScript中,重复声明同一个变量会导致变量冲突,在这个时候可以使用闭包创建独立的执行环境。 在JavaScript中,闭包是指封闭的执行环境&#xff…

“论软件开发过程RUP及其应用”写作框架,软考高级,系统架构设计师

论文真题 RUP(Rational Unified Process)是IBM公司的一款软件开发过程产品,它提出了一整套以UML为基础的开发准则,用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华,提供了一…

Wireshark显示过滤器常用关键字及过滤表达式

Wireshark显示过滤器常用关键字及过滤表达式 1. 过滤器类型 Wireshark抓包工具提供了两种类型过滤器:抓包过滤器 和 显示过滤器。 抓包过滤器: 抓取满足过滤条件的数据包,不满足过滤条件的数据包不会被抓取。 显示过滤器: 包已…

C语言基础⑩——构造类型(结构体)

一、数据类型分类 1、基本类型 整数型 短整型:short(2个字节);整型(默认):int(4个字节);长整型:long(8个字节)&#xf…

延迟队列插件

3.10 1.在opt文件夹里建一个rabbitmq文件夹,把插件放进去 2.拷贝到容器内plugins目录下(rabbitmq是容器的name,也可以使用容器id) docker cp /opt/rabbitmq/rabbitmq_delayed_message_exchange-3.10.0.ez rabbitmq:/plugins 进入 Docker 容器…

Java面试八股之什么是JMS

什么是JMS JMS(Java Message Service)是Java平台中关于面向消息中间件(MOM)的API,用于在分布式环境中发送和接收消息。JMS API提供了一种标准的、与供应商无关的方式,使得Java应用程序能够创建、发送、接收…

分布式数据库在传统车联网厂商的应用实践 | OceanBase案例

本文作者:慧视通科技,梁君 传统车联网厂商运维百亿级数据的痛点与难点 深圳慧视通科技(简称慧视通)作为专业的位置数据综合运营服务提供商,一直深耕智能交通领域,依托车联网、云计算、大数据处理、无线通信…