MySQL面试常问问题(高可用/性能 + 运维) —— 赶快收藏

news2025/1/15 6:44:42

1.数据库读写分离了解吗?

读写分离的基本原理是将数据库读写操作分散到不同的节点上,下面是基本架构图:

读写分离

读写分离的基本实现是:

  • 数据库服务器搭建主从集群,一主一从、一主多从都可以。

  • 数据库主机负责读写操作,从机只负责读操作。

  • 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据。

  • 业务服务器将写操作发给数据库主机,将读操作发给数据库从机。

2.那读写分离的分配怎么实现呢?

将读写操作区分开来,然后访问不同的数据库服务器,一般有两种方式:程序代码封装和中间件封装。

  1. 程序代码封装

程序代码封装指在代码中抽象一个数据访问层(所以有的文章也称这种方式为 "中间层封装" ) ,实现读写操作分离和数据库服务器连接的管理。例如,基于 Hibernate 进行简单封装,就可以实现读写分离:

业务代码封装

目前开源的实现方案中,淘宝的 TDDL (Taobao Distributed Data Layer, 外号:头都大了)是比较有名的。

  1. 中间件封装

中间件封装指的是独立一套系统出来,实现读写操作分离和数据库服务器连接的管理。中间件对业务服务器提供 SQL 兼容的协议,业务服务器无须自己进行读写分离。

对于业务服务器来说,访问中间件和访问数据库没有区别,事实上在业务服务器看来,中间件就是一个数据库服务器。

其基本架构是:

数据库中间件

3.主从复制原理了解吗?

  • master数据写入,更新binlog

  • master创建一个dump线程向slave推送binlog

  • slave连接到master的时候,会创建一个IO线程接收binlog,并记录到relay log中继日志中

  • slave再开启一个sql线程读取relay log事件并在slave执行,完成同步

  • slave记录自己的binglog

主从复制

4.主从同步延迟怎么处理?

主从同步延迟的原因

一个服务器开放N个链接给客户端来连接的,这样有会有大并发的更新操作, 但是从服务器的里面读取 binlog 的线程仅有一个,当某个 SQL 在从服务器上执行的时间稍长 或者由于某个 SQL 要进行锁表就会导致,主服务器的 SQL 大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。

主从同步延迟的解决办法

解决主从复制延迟有几种常见的方法:

  1. 写操作后的读操作指定发给数据库主服务器

例如,注册账号完成后,登录时读取账号的读操作也发给数据库主服务器。这种方式和业务强绑定,对业务的侵入和影响较大,如果哪个新来的程序员不知道这样写代码,就会导致一个bug。

  1. 读从机失败后再读一次主机

这就是通常所说的 "二次读取" ,二次读取和业务无绑定,只需要对底层数据库访问的 API 进行封装即可,实现代价较小,不足之处在于如果有很多二次读取,将大大增加主机的读操作压力。例如,黑客暴力破解账号,会导致大量的二次读取操作,主机可能顶不住读操作的压力从而崩溃。

  1. 关键业务读写操作全部指向主机,非关键业务采用读写分离

例如,对于一个用户管理系统来说,注册 + 登录的业务读写操作全部访问主机,用户的介绍、爰好、等级等业务,可以采用读写分离,因为即使用户改了自己的自我介绍,在查询时却看到了自我介绍还是旧的,业务影响与不能登录相比就小很多,还可以忍受。

5.你们一般是怎么分库的呢?

  • 垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。

垂直分库

  • 水平分库:以字段为依据,按照一定策略(hash、range 等),将一个库中的数据拆分到多个库中。

水平分库

6.那你们是怎么分表的?

  • 水平分表:以字段为依据,按照一定策略(hash、range 等),将一个表中的数据拆分到多个表中。

  • 垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。

表拆分

7.水平分表有哪几种路由方式?

什么是路由呢?就是数据应该分到哪一张表。

水平分表主要有三种路由方式:

  • 范围路由:选取有序的数据列 (例如,整形、时间戳等) 作为路由的条件,不同分段分散到不同的数据库表中。

我们可以观察一些支付系统,发现只能查一年范围内的支付记录,这个可能就是支付公司按照时间进行了分表。

范围路由

范围路由设计的复杂点主要体现在分段大小的选取上,分段太小会导致切分后子表数量过多,增加维护复杂度;分段太大可能会导致单表依然存在性能问题,一般建议分段大小在 100 万至2000 万之间,具体需要根据业务选取合适的分段大小。

范围路由的优点是可以随着数据的增加平滑地扩充新的表。例如,现在的用户是 100 万,如果增加到 1000 万,只需要增加新的表就可以了,原有的数据不需要动。范围路由的一个比较隐含的缺点是分布不均匀,假如按照  1000 万来进行分表,有可能某个分段实际存储的数据量只有 1000 条,而另外一个分段实际存储的数据量有 900 万条。

  • Hash 路由:选取某个列 (或者某几个列组合也可以) 的值进行 Hash 运算,然后根据 Hash 结果分散到不同的数据库表中。

同样以订单 id  为例,假如我们一开始就规划了 4个数据库表,路由算法可以简单地用 id % 4 的值来表示数据所属的数据库表编号,id 为 12的订单放到编号为 50的子表中,id为 13的订单放到编号为 61的字表中。

Hash路由

Hash 路由设计的复杂点主要体现在初始表数量的选取上,表数量太多维护比较麻烦,表数量太少又可能导致单表性能存在问题。而用了 Hash 路由后,增加子表数量是非常麻烦的,所有数据都要重分布。Hash 路由的优缺点和范围路由基本相反,Hash 路由的优点是表分布比较均匀,缺点是扩充新的表很麻烦,所有数据都要重分布。

  • 配置路由:配置路由就是路由表,用一张独立的表来记录路由信息。同样以订单id 为例,我们新增一张 order_router 表,这个表包含 orderjd 和 tablejd 两列 , 根据 orderjd 就可以查询对应的 table_id。

配置路由设计简单,使用起来非常灵活,尤其是在扩充表的时候,只需要迁移指定的数据,然后修改路由表就可以了。

配置路由

配置路由的缺点就是必须多查询一次,会影响整体性能;而且路由表本身如果太大(例如,几亿条数据) ,性能同样可能成为瓶颈,如果我们再次将路由表分库分表,则又面临一个死循环式的路由算法选择问题。

8.不停机扩容怎么实现?

实际上,不停机扩容,实操起来是个非常麻烦而且很有风险的操作,当然,面试回答起来就简单很多。

  • 第一阶段:在线双写,查询走老库

    1. 建立好新的库表结构,数据写入久库的同时,也写入拆分的新库

    2. 数据迁移,使用数据迁移程序,将旧库中的历史数据迁移到新库

    3. 使用定时任务,新旧库的数据对比,把差异补齐

      第一阶段

  • 第二阶段:在线双写,查询走新库

    1. 完成了历史数据的同步和校验

    2. 把对数据的读切换到新库

      第二阶段

  • 第三阶段:旧库下线

    1. 旧库不再写入新的数据

    2. 经过一段时间,确定旧库没有请求之后,就可以下线老库

第三阶段

9.常用的分库分表中间件有哪些?

  • sharding-jdbc

  • Mycat

10.那你觉得分库分表会带来什么问题呢?

从分库的角度来讲:

  • 事务的问题

使用关系型数据库,有很大一点在于它保证事务完整性。

而分库之后单机事务就用不上了,必须使用分布式事务来解决。

  • 跨库 JOIN 问题

在一个库中的时候我们还可以利用 JOIN 来连表查询,而跨库了之后就无法使用 JOIN 了。

此时的解决方案就是在业务代码中进行关联,也就是先把一个表的数据查出来,然后通过得到的结果再去查另一张表,然后利用代码来关联得到最终的结果。

这种方式实现起来稍微比较复杂,不过也是可以接受的。

还有可以适当的冗余一些字段。比如以前的表就存储一个关联 ID,但是业务时常要求返回对应的 Name 或者其他字段。这时候就可以把这些字段冗余到当前表中,来去除需要关联的操作。

还有一种方式就是数据异构,通过binlog同步等方式,把需要跨库join的数据异构到ES等存储结构中,通过ES进行查询。

从分表的角度来看:

  • 跨节点的 count,order by,group by 以及聚合函数问题

只能由业务代码来实现或者用中间件将各表中的数据汇总、排序、分页然后返回。

  • 数据迁移,容量规划,扩容等问题

数据的迁移,容量如何规划,未来是否可能再次需要扩容,等等,都是需要考虑的问题。

  • ID 问题

数据库表被切分后,不能再依赖数据库自身的主键生成机制,所以需要一些手段来保证全局主键唯一。

  1. 还是自增,只不过自增步长设置一下。比如现在有三张表,步长设置为3,三张表 ID 初始值分别是1、2、3。这样第一张表的 ID 增长是 1、4、7。第二张表是2、5、8。第三张表是3、6、9,这样就不会重复了。

  2. UUID,这种最简单,但是不连续的主键插入会导致严重的页分裂,性能比较差。

  3. 分布式 ID,比较出名的就是 Twitter 开源的 sonwflake 雪花算法

11.百万级别以上的数据如何删除?

关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。

所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。

  1. 所以我们想要删除百万数据的时候可以先删除索引

  2. 然后删除其中无用数据

  3. 删除完成后重新创建索引创建索引也非常快

12.百万千万级大表如何添加字段?

当线上的数据库数据量到达几百万、上千万的时候,加一个字段就没那么简单,因为可能会长时间锁表。

大表添加字段,通常有这些做法:

  • 通过中间表转换过去

    创建一个临时的新表,把旧表的结构完全复制过去,添加字段,再把旧表数据复制过去,删除旧表,新表命名为旧表的名称,这种方式可能回丢掉一些数据。

  • 用pt-online-schema-change

    pt-online-schema-change是percona公司开发的一个工具,它可以在线修改表结构,它的原理也是通过中间表。

  • 先在从库添加 再进行主从切换

    如果一张表数据量大且是热表(读写特别频繁),则可以考虑先在从库添加,再进行主从切换,切换后再将其他几个节点上添加字段。

13.MySQL 数据库 cpu 飙升的话,要怎么处理呢?

排查过程:

(1)使用 top 命令观察,确定是 mysqld 导致还是其他原因。

(2)如果是 mysqld 导致的,show processlist,查看 session 情况,确定是不是有消耗资源的 sql 在运行。

(3)找出消耗高的 sql,看看执行计划是否准确, 索引是否缺失,数据量是否太大。

处理:

(1)kill 掉这些线程 (同时观察 cpu 使用率是否下降),

(2)进行相应的调整 (比如说加索引、改 sql、改内存参数)

(3)重新跑这些 SQL。

其他情况:

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等

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

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

相关文章

洛谷——P1573 栈的操作

文章目录栈的操作题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示AC代码栈的操作 题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为 1,2,3,⋯,n1,2,3,\cdots ,n1,2,3,⋯,n。每一个栈只支持一种操作:弹出并压入…

当云原生成为一种显学,对象存储和数据湖如何顺势而为

前言: 已经成为数字化时代显学的云原生并非单项技术,而是一种重塑了软件开发和和业务运行应用的设计思想,是一套技术体系和方法论。云原生“Cloud Native”的Cloud 是指云平台,Native则表示应用程序从设计之初即使用云环境、天生…

MyBatis学习 | SQL映射文件

文章目录一、简介二、insert、update和delete标签2.1 关于增删改2.2 获取自增主键的值三、参数处理3.1 获取不同形式的参数3.1.1 获取单个参数3.1.2 获取多个参数3.2 #{Key}3.2.1 #{}🆚${}3.2.2 #{}中设置参数规则四、select标签4.1 select标签的主要属性4.2 关于返…

即时通讯音视频开发视频编解码理论

从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据信息数据冗余。数据冗余有许多种,如空间冗余、时间冗余、视觉冗余、统计冗余等。将图像作为一个信源,视频压缩编码的实质是减少图像中的冗余。 视频为何…

2步就能实现给视频去色并裁剪画面

看到很多小伙伴还不知道大量的视频怎么实现批量的进行去色处理,并且裁剪视频画面大小的方法,小编今天就来教大家一个可以快速操作的简单方法,感兴趣的朋友们快进来瞧瞧吧! 首先我们来看看用这个方法操作剪辑出来的效果&#xff0c…

预焙阳极行业现状:供给格局边际将改善 “双碳”下优质产品迎新机遇

预焙阳极属于碳素制品,是电解铝生产过程中不可缺少的大宗原材料。从用途来看,预焙阳极仅用作电解铝过程中电解槽的阳极材料,既作为导体,又参与电化学反应而产生消耗,预焙阳极的品质会对原铝的质量产生重要影响。 一、预…

免费PDF阅读器有哪些? 14款强烈推荐的PDF阅读器!

即使经过这么多年,PDF 仍然是最受欢迎的阅读格式之一。从阅读电子书或填写在线表格到创建用户手册,PF 格式仍然是最受欢迎的阅读方式。虽然现在的网络浏览器已经配备了基本的 PDF 阅读功能,但您仍然需要单独下载 PDF 阅读器才能实现填写表格、…

「另类」图达通,还缺一个二次进化

作者 | 张祥威 编辑 | 于婷中国的激光雷达公司早期都很幸运,禾赛、速腾聚创和图达通三家,分别遇到了自己的伯乐——蔚小理。 比较特别的是图达通,它与蔚来的合作之紧密,程度远超另外两家,堪称命中贵人。 根据图达通联合…

p5.js 光速入门

本文简介 点赞 关注 收藏 学会了 本文的目标是和各位工友一起有序的快速上手 p5.js ,会讲解 p5.js 的基础用法。 本文会涉及到的内容包括: 项目搭建p5.js 基础2D图形文字图形样式设置图片事件(交互相关的)基础动画 其中还会…

Ubuntu四轮小车仿真教程gazebo

主要实现内容为在ROS环境下基于Gazebo仿真软件创建一个四轮小车,并实现小车的控制,如下图所示,接下来教程将会进行详细解释。 1.创建工作空间 创建ROS工作空间,命名为SmartCar,并在该工作空间中创建src文件夹。 mkdi…

数字三渔冲:打造美丽乡村新范式

年初,中共中央 国务院关于做好 2022 年全面推进乡村振兴重点工作的意见中提到,要大力推进数字乡村建设,以数字技术赋能乡村公共服务。沿着乡村振兴的战略导向,并紧随筑堡工程共同缔造号召,长阳三渔冲村引入了 SENSORO …

[ Linux ] 死锁以及如何避免死锁

目录 1.什么是死锁? 死锁 2.模拟死锁情况 3.死锁四个必要条件 4.避免死锁的方法 5.避免死锁的算法 银行家算法(了解为主) 1.什么是死锁? 死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申…

Android入门第54天-SQLite中的Transaction

简介 上一篇我们完整的介绍了SQLite在Android中如何使用,今天我们要来讲一下“Transaction“即事务这个问题。 我们经常在编程中会碰到这样的业务场景: 没问题一系列有业务关联性表操作的数据一起提交;事务中只要有一步有问题,那…

PCL 点云最小生成树(MST,Dijkstra算法)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 之前使用过Kruskal算法创建过最小生成树(Open3D 点云最小生成树算法(MST,Kruskal算法)),这里使用另一种算法(Dijkstra算法)来实现创建一个最小生成树,原始的Dijkstra算法并不适用于去生成最小生成树,因此…

xxe-lab靶场安装和简单php代码审计

今天继续给大家介绍渗透测试相关知识,本文主要内容是xxe-lab靶场安装和简单php代码审计。 一、xxe-lab靶场简介 xxe-lab是一个使用java、python、php和C#四种编程语言开发的存在xxe漏洞的web小型靶场。利用该靶场可以简单研究xxe漏洞,并且对于这四种编…

Win10微软输入法打不出汉字?

在Win10系统中自带的微软输入法无需再安装其他拼音输入法就可以轻松输入汉字,非常方便,但是有的用户却遇到了Win10专业版自带的微软输入法打不出汉字的问题,这要如何解决呢?有需要的用户就来一起看看吧。 1、点击系统左下侧的wind…

Allegro如何更改铜皮的网络操作指导

Allegro如何更改铜皮的网络操作指导 在做PCB设计的时候需要更改铜皮的网络,Allegro上可以快速的更改铜皮的网络。如下图,需要给铜皮赋上网络 具体操作如下 选择selcet shape命令选中铜皮

会计毕业生的转行之路:坚持无畏,我是我自己的英雄

有时候,我们面对困境,总会犹豫,不敢迈出一步。 但当我们真的鼓起勇气打破困局时,才会发现出路就在眼前,原来只要不放弃,一切皆有可能。 初遇:会计生大四想转行 我是一名来自内蒙古的少数民族女生…

还有1个月,乘用车搭载首超5百万辆!L2/L2+前装交付一路狂奔

高工智能汽车研究院监测数据显示,2022年1-11月中国市场(不含进出口)乘用车交付上险为1745.95万辆,同比上年同期下滑4.01%,降幅和1-10月数据相比,继续放大,显示市场回暖低于预期。 不过&#xff…

单商户商城系统功能拆解52—财务概况

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…