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

news2024/10/3 0:21:04

文章目录

  • 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.coloradmin.cn/o/436719.html

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

相关文章

检测并打印C++编译器支持的feature(附Visual Studio 2022测试结果)

C标准快速迭代,不同的系统平台和编译器对C各种新功能的支持不同,通过这个程序可以测试所用编译器对各个版本C的支持情况。另一方面,可以在代码中通过这些宏针对不同版本编写不同的代码分支。 源码下面附上Visual Studio 2022的测试结果&#…

【字符串处理】

目录 总结: 只要一做字符串的题目必出bug, 本蒟蒻还是要开个专题写一下……懒狗直接引用chatgpt 在C中,我们可以使用以下几种方式进行字符串的输入: 1.使用输入运算符(>>): 可以按照空格分隔符把一个标准字符串(即不包含…

引用的底层原理(汇编指令),引用与指针的联系与区别

TIPS 2. 3. 4. 引用的底层本质 在语法层面上的话,这个引用是不开空间的,相当于是对一个变量进行一个取别名的这么一个操作。在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。然而如果你从底层的角度去看的话,因…

两小时让你全方位的认识文件(完结)

上期阿博给友友们讲了一些关于文件的一些读写操作,这期给友友们分享一下二进制的方式和文件操作的一些误区,下面来跟着阿博走进文件吧🤗🤗🤗 文章目录 一.fread和fwrite功能介绍二.文件的随机读写三.文本文件和二进制文…

17.网络爬虫—Scrapy入门与实战

这里写目录标题 Scrapy基础Scrapy运行流程原理Scrapy的工作流程Scrapy的优点 Scrapy基本使用(豆瓣网为例)创建项目创建爬虫配置爬虫运行爬虫如何用python执行cmd命令数据解析打包数据打开管道pipeline使用注意点 后记 前言: 🏘️🏘️个人简介…

第一章Git学习(尚硅谷新版Git快速入门)

文章目录 为什么要学习Git为什么要学习Git软件为什么要学习Git软件Git基础概念版本控制集中式、分布式版本控制的区别Git工作区域Git分支 版本号什么是版本号文件操作对应的版本号分支操作对应的原理 命令行操作Git相关配置的指令获取当前Git的配置信息名称和邮箱 Git文件操作相…

随笔-你买罐头干什么

生产环境不太稳定,正在挠头,想着怎么能解决这个问题。 聊天工具上突然弹出一张图片,是个不认识的人(暂且称为Z)发的。点进去一看,是从一个表格截取的一条数据,内容是我某次加班餐的订单。 Z&a…

带头单向链表源码及相关练习

目录 移除链表元素 链表的中间节点 链表倒数第k个节点 合并两个有序链表 相交链表 环形链表 环形链表2 分割链表 回文链表 public class MySingleList {//内部类的使用class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val val;}…

Java基础:容器知识点

目录 1、Java容器都有哪些? 2、Collection 和 Collections 区别? 3、List、Set、Map 间的区别? 4、HashMap 和 Hashtable 区别? 5、如何决定用 HashMap 还是 TreeMap? 6、HashMap 的实现原理? 7、说…

浮点型在内存中的存储

常见的浮点数: 3.14159 1E10(科学计数法:1.0*10^10) 浮点数家族包括: float、double、long double 类型 浮点数表示的范围:float.h中定义 下面举一个例子: int main() {int n 9;float *pFloat…

动态规划专练(一)

文章目录 前言一、斐波那契数1.题目介绍2.思路3.代码 二、爬楼梯1.题目介绍2.思路3.代码 三、使用最小花费爬楼梯1.题目介绍2.思路3.代码 前言 此篇为动态规划的初阶篇,所以比较简单,适合刚入门的新手学,如果你已经入门了,就无需看…

[LeetCode]杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上…

(三)Python-tkinter桌面应用(爱心雨)

(三)Python-tkinter桌面应用(爱心雨) 一、前言 我们已经了解到tkinter可以制作爱心,弹幕,为了能让他看起来更加的充满心意,于是,我们决定将他制作为爱心雨。让它看起来更加的特别&a…

字节测试总监深度剖析,都2023年了,测试用例还不重视起来

​ 测试用例对于测试工作的作用: 1、指导测试的实施 测试用例主要适用于集成测试、系统测试和回归测试。在实施测试时测试用例作为测试的标准,测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试。并对测试情况记录在测试用例管理软件中…

超长JVM总结,面试必备

目录 什么是JVM JVM内存区域 JVM运行时内存(jdk1.7) 垃圾回收与算法 分代收集算法 GC 分代收集算法 VS 分区收集算法 GC 垃圾收集器 什么是JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,…

ChatGPT已死?AutoGPT太强?

今天聊聊 AutoGPT。 OpenAI 的 Andrej Karpathy 都大力宣传,认为 AutoGPT 是 prompt 工程的下一个前沿。 近日,AI 界貌似出现了一种新的趋势:自主人工智能。 这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉…

PYTHON中的常见离散分布

1.什么是伯努利分布? 伯努利分布是一种二元随机变量的概率分布,其中一个结果的概率为p,另一个结果的概率为1-p。伯努利分布通常用于模拟二项分布,其中n个独立的伯努利试验被执行,每个试验有两个可能的结果&#xff08…

Unity VFX -- (5)VFX Graph基础

在Unity中,还有一种完全不同的创建VFX的工作流,VFX Graph。VFX Graph能够生成出和粒子系统相同或更好的效果。 相比于粒子系统,VFX Graph的一个最大的好处是它能够在保持应用良好性能的情况下,模拟出多得多的粒子。对于VFX艺术家来…

人生是一个长期的均值回归

到了现在这个阶段,总想说点什么。 我一直觉得记录并收藏每个阶段的状态是一件很有意义且奇妙的事,尤其是多少年后还能清晰地回忆其当初的心境,联想到曾经所设立的一些目标以及为之做出的努力,这些人生经历的脉纹清晰而完整&#x…

机器学习算法 KNN

文章目录 一、概述二、代码实现三、K值的选择四、距离计算五、总结1. K-近邻算法2. 优缺点 一、概述 k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是数据挖掘技术中原理最简单的算法。 KNN的工作原理:…