MySql-高级( 面试问题简析) 学习笔记

文章目录

  • 1. MySql 中 MyISAM 和 InnoDB 存储引擎区别
    • 1.1. MyISAM
    • 1.2. InnoDB
  • 2. 索引的数据结构
    • 2.1. B Tree索引
    • 2.2. B+Tree索引
    • 2.3. MySql 做的优化
  • 3. 为什么使用B+Tree索引而不使用Hash索引?
  • 4. 为什么使用B+Tree索引而不使用B-Tree索引?
  • 5. MyISAM 存储引擎索引实现
  • 6. InnoDB 存储引擎索引实现
  • 7. MySQL 复合索引如何使用
  • 8. 索引的缺点,以及使用注意
  • 9. 事务的几个特性
  • 10. 事务的隔离级别
  • 11. MySQL 是如何实现可重复读的
  • 12. MySQL 锁有哪些类型
  • 13. 悲观锁和乐观锁是什么?使用场景是什么
  • 14. MySQL 死锁的原理以及如何定位和解决
  • 15. MySQL 调优手段

1. MySql 中 MyISAM 和 InnoDB 存储引擎区别

1.1. MyISAM

  • 不支持事务
  • 不支持外键约束
  • 索引文件和数据文件是分开的,这样可以在内存里缓存更多的索引
  • 对查询的性能会更好,适用于少增改、多查询的需求

1.2. InnoDB

  • 支持事务
  • 聚簇索引
  • 强制要求有主键,支持外键约束
  • 大数据量可以分库分表、高并发可以读写分离、高可用可以主备切换这些都是基于 InnoDB

2. 索引的数据结构

2.1. B Tree索引

在这里插入图片描述

  • 每个节点要存放:
    • 数据
    • 指向下一节点的指针
    • 指向数据的指针

2.2. B+Tree索引

在这里插入图片描述

  • 非叶子节点要存放:
    • 下一节点的最小值
    • 指向下一节点的指针
  • 叶子节点要存放:
    • 具体的数据

2.3. MySql 做的优化

  • MySQL 在 B+Tree 的基础上,加了顺序访问的指针(如上图中 Q 连接的蓝色箭头),这样便于范围查找

3. 为什么使用B+Tree索引而不使用Hash索引?

  • 虽然Hash索引速度很快,但是它不支持范围查找
  • 上面说到加上了顺序访问指针的 B+Tree 是支持范围查找的

4. 为什么使用B+Tree索引而不使用B-Tree索引?

  • B+Tree每行存储的节点较多,原因如下:

    B-Tree结构中是将数据存储到了节点中,因此每行存的索引就变少了(规定每行存16kb)相应的深度(阶)比B+Tree深,会造成进行IO操作过多,影响性能。

  • 其次B+Tree中的叶子节点存在指针,由于指针的存在,在范围查找时,移动指针即可,而B-Tree不行

5. MyISAM 存储引擎索引实现

  • 因为索引文件和数据文件是分开的,所以在 B+Tree 的叶子节点中存储的不是具体的数据,而是数据对应的物理地址

6. InnoDB 存储引擎索引实现

  • InnoDB 数据文件本身也是一个索引文件,这个索引默认就是根据主键建立的聚簇索引
  • B+Tree 中每个叶子节点中存放的就是一个完整的数据

7. MySQL 复合索引如何使用

8. 索引的缺点,以及使用注意

  • 缺点
  • 会增加磁盘消耗、
  • 频繁增改索引,反而会影响性能
  • 使用注意
  • 尽量少的创建索引
  • 尽可能使用区分性高的字段建立索引

9. 事务的几个特性

  1. 原子性:成功一起成功,失败一起失败
  2. 一致性:在数据修改前后,必须都是准确的
  3. 隔离性:多个事务不能互相干扰,
  4. 持久性:事务成功提交后,对数据的修改必须永久有效

10. 事务的隔离级别

  • MySQL 默认的隔离级别为:可重复读
  1. 读未提交,导致脏读

    事务A对 ID = 1 的数据进行查询
    事务B对 ID = 1 的数据进行修改
    在事务B提交之前,事务A查询的结果就已经是事务B修改后的数据

  2. 读已提交,解决脏读,导致不可重复读

    事务A对 ID = 1 的数据进行查询
    事务B对 ID = 1 的数据进行修改
    事务B提交前,事务A读到的是原始数据
    事务B提交后,事务A再一次读取,读到的是更新后的数据
    两次读取数据不一致,就是不可重复读

  3. 可重复读,解决不可重复读

    事务A对 ID = 1 的数据进行查询
    事务B对 ID = 1 的数据进行修改
    事务B提交前,事务A读到的是原始数据
    事务B提交后,事务A再一次读取,读到的依旧是原始数据
    多次读取数据都是一致的,就是可重复读

  4. 串行化,解决幻读

    原先表中有一条数据
    事务A读取表中所有数据,此时查出了一条记录
    事务B向表中插入一行记录,并直接提交
    事务A再次读取,此时查出了两条记录
    两次读取数据行数不一致,就是幻读
    串行化,就是在事务 A 未提交时,事务B阻塞

11. MySQL 是如何实现可重复读的

  • 是使用了 多版本并发控制机制,Multi-version concurrent control (MVCC)
  • InnoDB 存储引擎,会在每行数据的最后加上两个隐藏列,
    • 一个是保存创建改行的事务ID
    • 另一个是保存删除改行的事务ID
    • 事务 ID 是 MySQL 自己维护的自增ID
  • 在查询操作时,需要满足以下两个条件
    • 查询创建行的事务ID 小于等于 当前事务ID 的行,这样可以确保这个行是在当前事务或者之前的事务中创建的
    • 查询删除行的事务ID 为空,或者大于当前事务ID 的行,这样可以保证这个行未被删除或者在之后的事务中被删除

12. MySQL 锁有哪些类型

  • 按照对数据操作的类型(读/写)来分
    • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
    • 写锁(排他锁):当前写操作没有完成前,他会阻断其他写操作和读操作
  • 按照对数据操作的粒度来分
    • 表锁(主要是MyISAM)
    • 行锁(主要是InnoDB)
      • 在增删改时会加行锁
      • 查的时候一般不会加锁,因为 InnoDB,一般读取的是 MVCC 的快照
    • 页锁

13. 悲观锁和乐观锁是什么?使用场景是什么

  • 悲观锁就是select * from table where id=1 for update,这就是加上了悲观锁,担心自己获取不到这一行的锁,先提前锁上,然后就可以对这一行数据进行其他操作
  • 乐观锁,就是认为自己想要获取锁的时候,就能获取到,不需要提前锁死。在查询数据的时候,除了正常的字段数据,再加上一个版本号,对这一行数据操作完成后,再判断当前库中版本号与之前读取的版本号是否一致,若一致则提交操作,若不一致则重新查询重新操作

14. MySQL 死锁的原理以及如何定位和解决

  • 死锁大致原因

    事务 A 对 ID = 1 的行加上排他锁
    事务 B 对 ID = 2 的行加上排他锁
    然后事务 A 想要请求 ID = 2 的行的锁
    接着事务 B 想要请求 ID = 1 的行的锁
    此时事务 A、B 互相等待

  • 解决:查看死锁日志,根据 SQL 定位对应的代码,排查原因

15. MySQL 调优手段

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-创建型模式之建造者模式

5. 建造者模式 5.1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节&…

FPGA学习笔记(三):PLL 锁相环

在 FPGA 芯片内部集成了 PLL(phase-locked loop,锁相环),可以倍频分频,产生其它时钟类型。PLL 是 FPGA 中的重要资源,因为一个复杂的 FPGA 系统需要不同频率、相位的时钟信号,一个 FPGA 芯片中 PLL 的数量是衡量 FPGA …

chatgpt智能提效职场办公-ppt怎么加音乐背景

作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 在 PowerPoint 中,您可以轻松地将音乐作为背景音乐添加到您的演示文稿中。下面是步骤: 打开您的 PowerPoint 演…

Linux文件类型与属性

一、文件类型 Linux 系统下一共分为 7 种文件类型。通过 stat 命令或者 ls 命令来查看文件类型。 - :普通文件 d :目录文件 c :字符设备文件 b :块设备文件 l :符号链接文件 s :套接字文件 p &…

关于今年五一调休。。

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

11、HOOK原理上

一、HOOK 1.1 HOOK简介 HOOK,中文译为“挂钩”或“钩子”.在iOS逆向中是指改变程序运行流程的一种技术.通过hook可以让别人的程序执行自己所写的代码. 在逆向中经常使用这种技术重点要了解其原理,这样能够对恶意代码进行有效的防护. 1.2 Hook的应用场景 描述一个HOOK实用技…

【李老师云计算】实验一:Hadoop伪分布式集群部署与Eclipse访问Hadoop进行单词计数统计

索引 前言实验内容1. 安装虚拟机1.1 安装与激活1.2 ★解决使用虚拟机蓝屏(绿屏) 2. 安装CentOS2.1 下载CentOS2.2 VMware新建虚拟机2.3 安装CentOS(包括GUI、主机名)2.4 ★解决已经创建虚拟机改主机名 3. VMWare 网络配置3.0 使用VI编辑器和VMware3.0.1 使用VI编辑器3.0.2 使用…

遇到Spring事务失效,你该怎么办?

Spring 事务场景失效是一个常见的问题。今天来分析这个问题。 1、事务方法被final、static关键字修饰,方法访问权限不是public Service public class UserService {Autowiredprivate UserDao userDao;// final修饰的事务方法Transactionalpublic final void addUse…

技术干货|直流电源自动测试系统功能介绍

直流电源是一种将交流电转换为恒定电压或电流输出的电子设备。在实际生产生活中,直流电源被广泛应用于各种场合。但由于各种原因,包括工艺、质量等因素,直流电源存在一定的出厂偏差。为了确保直流电源的精度和稳定性,在生产过程中…

如何将模块加载到linux内核

一 顺利的情况 假设存在一个文件叫mymq.c,下该文件相同目录下的makefile如下语句: obj-y mymq.o 然后编译:编译完成了以后,mymq.c文件中,有个函数叫mymq_open,搜索这个函数在不在System.map文件中,如果在&#xff…

开放式耳机真的比封闭式强很多吗?推荐几款主流的开放式耳机

​开放式耳机,顾名思义,就是通过骨头振动来传导声音的耳机。相比于传统耳机,它的声音传输更加开放,不会对耳膜造成压迫感,也不会对耳膜旁的内毛细胞造成损害。因此开放式耳机既是运动蓝牙耳机,又是音乐蓝牙…

Spring依赖注入的三种方式使用及优缺点

初学Spring的时候,我们从Spring容器中获取Bean对象都是通过bean标签先将Bean对象注册到Spring容器中,然后通过上下文对象congtext的getBean方法进行获取,显然这种方法较为麻烦,所以有了更简单的存方法:五大类注解;取方…

在Linux中进行Jenkins-2.190的安装及使用

Jenkins-2.190安装在公网IP为x.x.x.x的服务器上 环境准备 第一步,下载server-jre-8u202-linux-x64.tar.gz安装包。 登录地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html下载server-jre-8u202-linux-x64.tar.gz…

3自由度并联绘图机器人实现写字功能(一)

1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能。 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板Bigfish2.1扩展板电池7.4V锂电池 3. 功能…

能量密度的必要性:城市比乡村具有更高的能量密度

文章目录 引言I 人口密度1.1 人口密度太低对于经济的发展的不利因素1.2 足够的人口密度带来的好处1.3 乌鲁克城II 农耕文明和商业文明2.1 农耕文明2.2 商业文明III 有效掌握动力的文明处于优势3.1 苏美尔人- 轮子&风能的利用3.2 英国人- 以蒸汽机为代表的工业革命引言 文明…

作业3综合练习

综合练习: 要求:请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于www.openlab.com/student #更改配置文件 (虚拟主机标签…

2023好玩的解压游戏,压力大点开玩可以放松自己

你是不是经常感觉到压力大? 现代社会,竞争逐步激烈,不管是来自学习上,工作上,还是生活上的,压力都非常大! 这时候,我们要学会自我减压,有效的放松是为了更好地前行。 …

新互联网人必学-产品经理课无密为伊消得人憔悴

新互联网人必学-产品经理课 download:https://www.666xit.com/3832/ 产品经理:连接用户需求和产品设计的重要角色 随着移动互联网的迅猛发展,产品经理已成为越来越多IT公司中不可或缺的职位。作为一名产品经理,他所扮演的角色是…

如何使用DNS实现融合CDN功能

将托管DNS解决方案与CDN配对可为您的网站提供额外的性能、可靠性和灵活性。 域名系统(DNS)是一种用于计算机、服务或连接到Internet或专用网络的任何资源的分层分布式命名系统,它将各种信息与分配给每个参与实体的域名相关联,它基…

【LeetCode】剑指 Offer 66. 构建乘积数组 p312 -- Java Version

题目链接:https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/ 1. 题目介绍(66. 构建乘积数组) 给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素…
最新文章