当前位置: 首页 > news >正文

面试数据库八股文十问十答第二期

面试数据库八股文十问十答第二期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!

⭐点赞⭐收藏⭐不迷路!⭐

1.MySQL的主从复制

  • MySQL的主从复制是什么?
  • MySQL主从复制是一种常见的数据库复制技术,它的目的是将主数据库的更新同步到从数据库中,从而实现数据的备份和负载均衡。
  • 原理:MySQL主从复制采用了基于日志的复制机制,即主库将更新操作记录在二进制日志中,从库通过读取主库的二进制日志来复制主库的更新操作。从库接收到主库的更新操作后,会将这些操作应用到自己的数据库中,从而实现数据的同步。
  • 主从复制的作用
  • 作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
  • 业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的评率,提高单个机器的I/O性能。
  • 读写分离使数据库能支持更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
  • 怎么实现主从复制?
  • (1)创建主库和从库。(2)在主库上开启二进制日志,并设置唯一的 server-id。(3)在从库上设置唯一的 server-id,并将主库的二进制日志同步到从库中。(4)在从库上创建复制账户,并授权给主库的 IP 地址。(5)在从库上启动复制进程,连接到主库,并开始复制数据。(6)在主库上进行数据更新操作,更新的操作将被记录在二进制日志中。(7)从库接收到主库的更新操作后,将这些操作应用到自己的数据库中,从而实现数据的同步。
  • 注意点: 由于主从复制是异步的,从库可能会有一定的延迟,需要根据具体的应用场景进行调整和优化。

2.MySQL存储引擎,MyISAM和InnoDB的特点和使用场景

MySQL常见存储引擎:

InnoDB是MySQL的默认存储引擎,支持ACID事务,具有高并发性、可靠性和稳定性。InnoDB采用MVCC(多版本并发控制)来实现高并发的读写操作,支持行级锁定,可以提高并发性能。InnoDB也支持外键、回滚等特性,适合于事务性应用场景,例如电子商务、金融等。

  1. MyISAM是一种简单、高效的存储引擎,不支持事务和行级锁定,但具有快速的读取和写入速度,适合于大量查询和少量更新的场景,例如博客、新闻网站等。
  2. MEMORY存储引擎可以将数据存储在内存中,具有快速的读取和写入速度,但是数据存储在内存中,容易丢失。MEMORY存储引擎适合于对数据进行快速计算和缓存数据的场景。
  3. NDB Cluster存储引擎是一种分布式存储引擎,具有高可用性和高可伸缩性,可以实现多台服务器之间的数据共享和负载均衡,适合于大型高并发的应用场景,例如电信、游戏等。
  4. CSV存储引擎将数据存储在文本文件中,具有快速的导入和导出数据的特点,但是不支持事务和索引,适合于对数据进行批量处理的场景。
  5. ARCHIVE存储引擎是一种存档式存储引擎,可以实现快速的数据压缩和解压缩,适合于存储历史数据或备份数据的场景。InnoDB和MyISAM区别1).MyISAM是非事务安全型的,而InnoDB是事务安全型的。2).MyISAM锁的粒度是表级,而InnoDB支持行级锁定。3).MyISAM支持全文类型索引,而InnoDB不支持全文索引。4).MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。5).MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。6).InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。

3.聚簇索引和非聚簇索引

聚簇索引

聚簇索引又称为主索引,是一种物理排序的索引,它决定了表中数据的物理存储顺序。聚簇索引的叶子节点存储的是数据本身,因此聚簇索引可以快速地定位到数据行。由于聚簇索引决定了数据的物理存储顺序,因此一个表只能有一个聚簇索引。

非聚簇索引

非聚簇索引又称为辅助索引,不影响表中数据的物理存储顺序。非聚簇索引的叶子节点存储的是索引键值以及指向数据行的指针,因此需要通过索引键值查找数据行。一个表可以有多个非聚簇索引。

聚簇索引和非聚簇索引的使用场景不同,需要根据具体的应用场景来选择。一般来说,如果需要经常进行范围查询或聚合计算,那么就应该使用聚簇索引。如果需要经常用于查询和排序,那么就应该使用非聚簇索引。

需要注意的是,虽然聚簇索引的查询速度快,但是由于每次插入和更新数据都会改变数据的物理存储顺序,因此会影响性能。在使用聚簇索引时,需要避免频繁的插入和更新操作。同时,在选择索引类型时,需要根据具体的应用场景和需求来综合考虑。

4.b树和b+树的区别

  • 在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。

  • B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。

  • 由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。

  • B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

  • 但是B树也有优点,其优点在于,由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。

  • B 树:优点:

    • 快速的查找和插入操作;
    • 适合大数据量、高并发的场景;
    • 内部数据结构稳定,能够保证树形结构的可靠性。
  • 缺点:

    • 存储容量较大,需要更多的存储空间;
    • 树的高度较高,会导致查询效率降低。
  • 使用场景:

    • 对于需要快速查找、插入操作的大数据量场景,如搜索引擎、数据挖掘等;
    • 需要支持并发访问的场景,如金融交易系统等。
  • B+树:优点:

    • 相对于 B 树,B+树的存储容量较小,更节省存储空间;
    • 查询效率更高,更适合大数据量、低并发的场景;
    • 内部数据结构更加稳定,能够保证树形结构的可靠性。
  • 缺点:

    • 查找和插入操作的性能比 B 树略低;
    • 树的高度较高,会导致查询效率降低。
  • 使用场景:

    • 对于需要高效查询、少量插入和删除操作的大数据量场景,如电子商务网站等;
    • 需要支持并发访问的场景,如金融交易系统等。

5.Innodb引擎执行update语句的执行流程?

1.查询解析和优化:当你执行UPDATE语句时,MySQL首先会对查询进行解析,以确定要更新的表和相应的行。然后,它会进行优化,以确定如何执行更新操作。

2.事务的启动:如果你的UPDATE语句没有包含在一个显式的事务中,InnoDB会自动启动一个事务。事务是用来维护数据的一致性和隔离性的机制。

3.锁定行:InnoDB使用行级锁定来确保并发事务不会互相干扰。在执行UPDATE语句时,InnoDB会锁定要更新的行,以防止其他事务同时修改这些行。这可以是排它锁(X锁)或共享锁(S锁),具体取决于事务的隔离级别和行的当前锁定状态。

4.执行更新操作:InnoDB会根据UPDATE语句的条件更新符合条件的行。更新操作将修改数据行中的值。

5.写入redo日志:InnoDB会将更新操作写入事务的redo日志中,以确保数据持久性。这允许数据库在崩溃后恢复到一致的状态。

6.写入binlog日志: 在binlog记录一下逻辑日志,对哪个数据页的哪条数据进行了什么修改。

7.提交事务:如果UPDATE语句没有出现错误,并且没有显式回滚事务,事务将被提交,更新操作将成为持久的。

8.释放锁:在事务提交后,InnoDB会释放之前锁定的行,允许其他事务访问它们。

9.返回结果:UPDATE语句执行完毕后,返回更新的行数或其他相关信息。

6.数据库的两阶段提交是怎么样的?

日志文件两阶段提交技术就解决了redo 日志和 binlog 日志文件记录数据不一致的问题

7.MySQL关键字的执行顺序

1.from

  1. where

  2. group by

  3. having

  4. select

  5. order by

8.什么样的数据不推荐加索引?

1.低选择性的列:低选择性的列指的是具有很少不同值的列。如果一列只有很少几个不同的值,那么为它添加索引可能不会提供显著的性能改进,而且可能浪费存储空间。例如,性别列通常只有两个不同的值(男和女),对其添加索引通常没有太大意义。

2.频繁更新的列:如果一个列经常被更新,特别是大规模的批量更新,那么索引会增加更新操作的开销。每次更新索引列都需要维护索引结构,这可能会导致性能下降。在这种情况下,需要仔细权衡查询性能和更新性能。

3.小表:对于非常小的表,查询通常非常快,即使没有索引。在这种情况下,添加索引可能只会增加存储开销,而不会明显提高性能。

4.不常被查询的列:如果一个列很少被用于查询条件,那么为其添加索引可能没有多大意义。索引应该主要用于加速经常被查询的列。

5.短文本列:对于非常短的文本列,如标签或枚举值,索引的效益可能有限。短文本列通常可以快速地进行全表扫描而不需要索引。

6.临时表:用于存储临时数据的表通常不需要索引,因为它们的生命周期很短暂,不会频繁进行查询操作。

9.索引失效的场景?

1.索引列值为null,索引失效

2.左或左右模糊匹配,因为mysql采用最左匹配原则。

3.查询条件中队索引列使用函数。

4.查询条件对索引列使用表达式计算。

5.如果索引列是字符串,并且条件语句中输入参数是数字,那么索引列会产生隐式类型转换,CAST函数实现,因为等同于堆索引列使函数,导致索引失效,反之索引列是数字,输出参数是字符串,那么不会失效。

6.在 WHERE 子句中,如果在 OR 前的条件列是索引列,但OR后面的条件列不是索引列。

7.数据量极少的情况下,MySQL 不会使用索引,因为全表扫描速度更快。

8.使用 select * 语句,大概率不会走索引,因为不是每一列都加索引。

9.但如果把两个单独建了索引的列,用来做列对比时索引会失效。

10.主键字段使用 Not In 关键字查询数据范围,依然走索引,如果是普通索引使用 Not In 关键字查询数据范围,索引失效。

11.使用 Not Exists 关键字,索引也会失效。

12.使用 Order by 注意最左匹配,并且要加limit或者where关键字,否则索引会失效。

10.介绍一下红黑树和平衡二叉树的区别?

红黑树的规则:

1、根节点为黑色。

2、所有节点都是黑色或红色。

3、所有叶子节点(Null)都是黑色。

4、红色节点的子节点一定是黑色的。

5、任意一个节点到其叶子节点的所有路径上的黑色节点数量相同(黑色完美平衡二叉树)。

  • 平衡二叉树的左右子树的高度差绝对值不超过1,但是红黑树在某些时刻可能会超过1,只要符合红黑树的五个条件即可。
  • 二叉树只要不平衡就会进行旋转,而红黑树不符合规则时,有些情况只用改变颜色不用旋转,就能达到平衡。

相关文章:

面试数据库八股文十问十答第二期

面试数据库八股文十问十答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1.MySQL的主从复制 MySQL的主从复制是什么?MySQL主从复制是一种常见的…...

【LeetCode】每日一题 2023_12_2 拼车(模拟/差分)

文章目录 刷题前唠嗑题目:拼车题目描述代码与解题思路学习大佬题解 刷题前唠嗑 LeetCode?启动!!! 题目:拼车 题目链接:1094. 拼车 题目描述 代码与解题思路 func carPooling(trips [][]int…...

网络和Linux网络_7(传输层)UDP和TCP协议(端口号+确认应答+超时重传+三次握手四次挥手)

目录 1. 重看端口号 1.1 端口号的概念 1.2 端口号的划分 2. 重看UDP协议 2.1 UDP协议格式 2.2 UDP的特点 3. 重看TCP协议 3.1 TCP协议格式 3.2 TCP的解包分用 3.3 TCP的可靠性及机制 3.3.1 确认应答ACK机制 3.3.2 超时重传机制 3.3.3 连接管理机制(三次…...

KALI LINUX安全审核

预计更新 第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …...

2023-12-03-解决libxkbcommon库编译完后图像界面不能使用键盘

layout: post # 使用的布局(不需要改) title: Ubuntu修复 # 标题 subtitle: 解决libxkbcommon库编译完图形界面不能使用键盘 #副标题 date: 2023-12-03 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 c…...

vue el-table表格中每行上传文件(上传简历)操作

1、HTML中 <el-table :data"formInfo.userListDto" border stripe max-height"400"><el-table-column type"index" label"序号" width"50"> </el-table-column><el-table-column prop"realName&q…...

Python批量图像处理--图片重命名、图片旋转

图像批量重命名&#xff1a; 使用batch_rename_images函数实现对多个文件夹下面的图片进行重命名操作 先检查文件名的后缀&#xff0c;使用了.endswith()方法来判断文件名是否以.jpg、.png或.JPG结尾&#xff0c;判断是否为图片文件 然后构造新的文件路径new_filepath&#…...

第五天 用Python批量处理Excel文件,实现自动化办公

用Python批量处理Excel文件&#xff0c;实现自动化办公 一、具体需求 有以下N个表&#xff0c;每个表的结构一样&#xff0c;如下&#xff1a; 需要把所有表数据汇总&#xff0c;把每个人的得分、积分分别加起来&#xff0c;然后按总积分排名&#xff0c;总积分一致时&#xff…...

mybatis整合(手动添加jar包方式)

操作步骤 创建数据库 建立user表 放入数据 1、创建javaweb工程并添加Jar包 用到的jar包 junit 用于测试 mybatis框架&#xff1a;mybatis-3.5.9.jar mysql数据库&#xff1a;mysql-connector-java-8.0.28.jar 2、添加MyBatis核心配置文件 <?xml version"1.0"…...

leetcode - 矩阵区域和

1314. 矩阵区域和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c …...

头歌JUnit单元测试相关实验进阶

JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架&#xff08;regression testing framework&#xff09;&#xff0c;主要供 Java 开发人员编写单元测试。Junit在极限编程和重构中被极力推荐使用&#xff0c;因为它可以大大地提高开发的效率。 Junit的特性&…...

【kafka实践】11|消费位移提交

消费者位移 消费者位移这一节介绍了消费者位移的基本概念和消息格式&#xff0c;本节我们来聊聊消费位移的提交。 Consumer 需要向 Kafka 汇报自己的位移数据&#xff0c;这个汇报过程被称为提交位移&#xff08;Committing Offsets&#xff09;。因为 Consumer 能够同时消费…...

Mac卸载、安装Python

卸载 说明 对于删除 Python&#xff0c;我们首先要知道其具体都安装了什么&#xff0c;实际上&#xff0c;在安装 Python 时&#xff0c;其自动生成&#xff1a; Python framework&#xff0c;即 Python 框架&#xff1b;Python 应用目录&#xff1b;指向 Python 的连接。 …...

算法——滑动窗口

滑动窗口大致分为两类&#xff1a;一类是窗口长度固定的&#xff0c;即left和right可以一起移动&#xff1b;另一种是窗口的长度变化&#xff08;例如前五道题&#xff09;&#xff0c;即right疯狂移动&#xff0c;left没怎么动&#xff0c;这类题需要观察单调性(即指针)等各方…...

带头双向循环链表:一种高效的数据结构

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…...

C++基础 -34- 输入输出运算符重载

输出运算符重载格式 ostream & operator<<(ostream &out,person a) {cout << a.a << endl;return out; }举例输出运算符重载 #include "iostream"using namespace std;class person {public:person(int a):a(a){}int a; };ostream &…...

MimicGen论文分析与资料汇总

MimicGen论文分析与资料汇总 前言论文分析相关资料汇总 前言 论文分析 相关资料汇总 Paper:MimicGen: A Data Generation System for Scalable Robot Learning using Human Demonstrations mimicgen.github 破局利刃&#xff01;英伟达合成数据新成果&#xff1a;为机器人造…...

JAVA-每一页PDF转图片

结论&#xff1a;1、iText几乎找不到如何PDF转图片的信息&#xff0c;但能找到获取到PDF里面的图片并保存下来的信息&#xff1b;2、PDF box满大街都是参考代码&#xff08;下面会附上一个作为参考&#xff09;&#xff1b;3、收费的库使用起来更简单&#xff0c;但就是要收费&…...

VS安装QT VS Tools编译无法通过

场景&#xff1a; 项目拷贝到虚拟机内部后&#xff0c;配置好相关环境后无法编译&#xff0c;安装QT VS Tools后依旧无法编译&#xff0c;查找资料网上说的是QT工具版本不一致导致的&#xff0c;但反复试了几个版本后依旧无法编译通过。错误信息如下&#xff1a; C:\Users\Ad…...

【C语言之 CJson】学CJson看这一篇就够了

文章目录 前言一、下载CJson二、创建一个json2.1 创建json对象cJSON类型详解 2.2 创建键值对2.3 添加嵌套的 JSON 对象2.4 添加数组创建数组添加元素到数组添加数组到obj 2.5 将 JSON 对象转为字符串2.6 释放内存2.7 示例代码 三、解析json3.1 解析json root3.2 把一个key解析出…...

使用Java语言实现字母之间的大小写转换

这个类的作用为实现字母之间的大小写转换&#xff0c;通过加减32来完成。 输入的代码 import java.util.Scanner; public class WordChangeDemo {public static void main(String[] args){try (Scanner in new Scanner(System.in)) {System.out.println("请输入您要进…...

Docker的数据持久化;Docker网络;Dockerfile编写

Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b; 文章目录 Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b;**Docker的数据持久化**1&#xff09;将本地目录映射到容器里2&#xff09;数据卷3&#xff09;将…...

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日&#xff0c;MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&a…...

windows11 调整鼠标灵敏度方法

首先 我们打开电脑设置 或者在 此电脑/此计算机/我的电脑 右击选择属性 然后 有的电脑 左侧菜单中 直接就有 设备 然后在设备中直接就可以找到 鼠标 选项 调整光标速度即可 如果操作系统和我的一样 可以直接搜索鼠标 然后 选择 鼠标设置 然后 调整上面的鼠标指针速度即可...

贪心算法个人见解

目录 基本思想&#xff1a; 贪心算法的步骤&#xff1a; 示例&#xff1a; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的算法范式&#xff0c;它在每一步选择中都采取当前状态下的最优选择&#xff0c;而不考虑全局最优解。贪心算法通常适用于那些…...

Win中Redis部署与配置

1.下载msi版本 下载传送门 2.双击next-->next安装安装 3.密码配置以及开机自启 在配置文件中配置相应配置进行配置密码以及端口和ip port 6379指定 Redis 监听端口&#xff0c;默认端口为 6379&#xff0c;作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口&…...

vue el-button 封装及使用

使用了 Element UI 中的 el-button 组件&#xff0c;并对其进行了封装和定制。 创建组件index.vue (src/common-ui/button/index.vue) <template><el-buttonclass"h-button":type"type":icon"hIcon":disabled"disabled"clic…...

QT之QMediaPlayer的用法

QT之QMediaPlayer的用法 成员函数例程 成员函数 1)setMedia(const QMediaContent &media, QIODevice *stream nullptr) 设置要播放的媒体内容&#xff0c;其中参数media指定了媒体内容&#xff0c;stream参数指定了用于读取媒体的输入设备&#xff08;如文件流&#xff0…...

TCP_报文格式解读

报文格式 header部分字段含义解析 固定字段 对于header中固定部分字段含义&#xff0c;见之前的blog《TCP报文分析》&#xff1b; 对部分字段含义补充说明 Data Offset&#xff1a;4bit&#xff0c;tcp header的长度&#xff0c;单位&#xff1a;32bit&#xff08;4字节&…...

C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词下篇)

一.枚举&#xff08; enum&#xff09; 枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。定义一个枚…...