面试问答之MySQL数据库进阶

文章目录

  • 🐒个人主页:信计2102罗铠威
  • 🏅JavaEE系列专栏
    • 📖前言:
    • 🎀 MySQL架构
    • 🐕数据库引擎
      • 🐕 InnoDB存储存储引擎
      • 🐕MYISAM
    • 🏨索引
      • 🐕哪些情况需要创建索引?
      • 🐕哪些情况不要创建索引
      • 🐕索引的分类
        • 🪀组合索引的最左前缀原则
    • 🐕 索引的数据结构(为什么使用到B+树?)
      • 🐕聚簇索引和非聚簇索引
    • 🏨事务的特性ACID
      • 🦓事务的隔离级别
      • 🪀事务的实现原理
      • 🪀隔离级别的实现原理 MV CC (多版本并发控制 Multi-Version Concurrent Control)
      • 🪀数据库中的锁
    • 🎀SQL优化

🐒个人主页:信计2102罗铠威

🏅JavaEE系列专栏

📖前言:

本篇博客主要总结MySQL数据库面试中常问的考察点

🎀 MySQL架构

大致可以分为四层:

  1. 连接层: 负责接收客户端的连接服务请求、进行授权认证
  2. 服务层: 接收SQL语句,对SQL进行解析、优化、缓存,使用触发器,存储过程,函数,DML,DDL语句
  3. 引擎层 :是真正具体实现的数据存储方式,不同的存储引擎特点不同
  4. 物理文件存储层: 使用各种文件用来存储数据 ,以及各种日志文件。例如undo.log 、redo.log 文件

🐕数据库引擎

在这里插入图片描述

🐕 InnoDB存储存储引擎

支持事务,行级锁(并发量大),有外键约束,支持全文索引,支持缓存,
支持主键自增,容量大。不存储表的总行数,需要sql逐行统计

🐕MYISAM

不支持事务,不支持外键,不支持行锁,只有表锁(并发量小),表空间小。
支持全文索引,存储了表的总行数,统计速度快。适合查询多。增删改较少的场景。

🏨索引

是类似于字典的目录索引,可以快速定位数据真实的位置,是排好序的,方便快速查找的数据结构(B+树)
优点:可快速定位数据的位置,减少磁盘I/O的次数,可以通过索引列进行分组、排序、查询,提高了查询效率。
缺点:索引需要额外的存储空间,每次修改数据还需要维护更新索引树,需要消耗时间。

🐕哪些情况需要创建索引?

  1. 主键会自动创建索引
  2. 频繁作为查询条件的列
  3. 查询中与其他表关联的列,外键需要创建
  4. 查询在排序的列,(若建立索引将等待提高排序速度)
  5. 分组中的字段

🐕哪些情况不要创建索引

  1. 列中出现很多重复值
  2. 表记录太少
  3. 经常进行增删改的表不建议(需要频繁维护索引树)
  4. 经常不作为查询条件的字段

🐕索引的分类

在这里插入图片描述
在这里插入图片描述

🪀组合索引的最左前缀原则

列如表中有 a,b,c 3 列,组合索引(a,b),非索引列c ,筛选条件必须包含左边第一列a,否则索引不生效

select * from table where a=’’and b=’’索引生效
select * from table where b=’’and a=’’索引生效
select * from table where a=’’and c=’’索引生效
select * from table where b=’’and c=’’索引不生效

🐕 索引的数据结构(为什么使用到B+树?)

由于要存储很多数据并要求尽可能少的查询次数,所以选择树 的数据结构。
如果是二叉树,高度还是有点高,所以使用多叉树
但是添加数据可能会出现不平衡的情况,左子树为空,右子树很多数据。所以使用自平衡的多路查找树 B-树。
MySQL又根据经常范围查询、和性能上的改进,将B-树,改进成B+树.
B-树是每个节点都存储数据,高度是平衡的。
B+树是非叶子节点只存储索引,真实的数据存储在叶子节点上,并且叶子节点维护了一个双向链表,支持范围查询。
在这里插入图片描述

🐕聚簇索引和非聚簇索引

主要看是否可以直接找到,是否需要回表查询。
聚簇索引:找到了索引,就找到了数据。Innodb中主键索引(一级索引)。

非聚簇索引 Innodb中也存在非聚簇索引,二级索引(除主键外的列)会2先找到主键,再根据主键来找到数据。在这里插入图片描述
数据库事务:在一次执行中,可能包含了多条sql语句,这些指令必须同时提交成功,或者失败回滚。不允许其他线程或事务进行干扰。MYISAM不支持事务,只有Innodb引擎才支持事务。

🏨事务的特性ACID

原子性:不可分割,一气呵成,不受其他事务干扰
隔离性:事务具有独立性,允许多个并发事务同时对数据进行读写的能力(读未提交,读已提交,可重复读,串行化)
持久性:事务一旦提交,将记录在硬盘上做到永久性保存。
一致性:数据经过多次操作,结果与预期相符,保证数据完整性。

🦓事务的隔离级别

就是对数据共享的开放程度
“读未提交”:一个事务可以读取到另一个事务未提交的修改。
缺陷:会造成脏读、幻读、不可重复读问题。解决办法:改成“读已提交”
“读已提交”:B事务读到了A事务已经提交的事务。解决了“脏读”问题
缺陷:仍然有“幻读”、不可重复读问题
“可重复读”:(默认隔离级别)B事务在开启后的两次查询中,两次查询结果是相同的,解决了“不可重复读”
缺陷:还有“幻读”问题
“串行化”:只有一个事务操作,加锁了,哪怕是查询操作也得等,解决一切问题,但效率最低。

🪀事务的实现原理

原子性和隔离性 :依靠undo log(回滚日志)保存每次操作的反向操作,实现回滚的

  • 例如:我们执行insert语句,undo log日志中保存对应的delete语句
    持久性:每当执行修改数据的操作时,先会将语句保存到redo log(重做日志)中,即使突然断电,正常后也可以从redo log日志中恢复数据

🪀隔离级别的实现原理 MV CC (多版本并发控制 Multi-Version Concurrent Control)

对于 “读已提交”:在同一个事务中实时访问到最新的数据,每次读时,都会给最新的版本链拍照,所以读到的数据是最新的
对于 “可重复读”:在一个事务中,第一次查询的结果与第二次查询的结果保持一致,在第一次查询的时候,会给当前版本链拍个数据快照,下次查询时,找到当初的版本链读数据。
使用隔离级别机制,为了实现并发的读写、写读,来提高并发效率

🪀数据库中的锁

按锁的粒度划分:行锁、间隙锁、表锁
行锁:Innodb引擎默认,对一行加锁,锁冲突概率低,并发度高
间隙锁:对某一区间加锁,区间可不连续
表锁:MYISAM引擎默认,对整个表加锁,锁冲突概率高,并发度低
按锁的工作状态划分:共享锁(读锁)、排他锁(写锁)
在这里插入图片描述

🎀SQL优化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Vue3.0里为什么要用 Proxy API 替代 defineProperty API

一、Object.defineProperty 定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象 为什么能实现响应式 通过defineProperty 两个属性,get及set get 属性的 getter 函…

阿里云幻兽帕鲁Palworld服务器4核16G和8核32G配置价格表

2024阿里云幻兽帕鲁专用服务器价格表:4核16G幻兽帕鲁专用服务器26元一个月、149元半年,默认10M公网带宽,8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例,CPU采用Intel Xeon …

新版AndroidStudio的Gradle窗口显示task list not built 问题解决

在使用新版AndroidStudio时,会出现,Task List not built 的问题。如果你记得task的名字,当然可以 直接通过命令 gradle taskname 或者 ./gradlew taskName直接执行即可,但是若是记不住,还是把这个任务构建处理比较好用…

数据结构 之 链表LinkedList

目录 1. ArrayList的缺陷: 2. 链表: 2.1 链表的概念及结构: 3. 链表的使用和模拟实现: 3.1 构造方法: 3.2 模拟实现: 4. 源码分享: 在我学习顺序表之后,我就立马开始了链表的学…

专业138+总分400+南航南京航空航天大学878考研经验电子信息与通信工程,真题,大纲,参考书

经过一年的复习,顺利被南京航空航天大学录取,初试专业课878数字电路和信号与系统138,总分400,回看这一年的复习,从择校到考研备考经历了很多,也有很多想和大家分享的复习经验,希望对大家复习有所…

MateBook X Pro 2019款 集显(MACHR-WX9)工厂模式原装出厂Win10系统 带F10智能还原

HUAWEI华为MateBook X笔记本电脑原厂Windows10系统恢复工厂包 适用型号:MACHR-WX9、MACHR-W29、MACHR-W19 链接:https://pan.baidu.com/s/1x6vvCxmEgM2Oa_Uom8r9Iw?pwd588m 提取码:588m 系统自带F10一键智能还原功能、自带所有驱动、系统…

【C++】反向迭代器仿函数模板进阶

反向迭代器&仿函数&模板进阶 一,反向迭代器1. 什么是反向迭代器2. 模拟实现3. 如何使用 二,仿函数1. 仿函数的概念2. 仿函数的用法 三,模板1. 非类型模板参数2. 模板的特化2.1 特化概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.…

【Java设计模式】十五、命令模式

文章目录 1、命令模式2、案例3、总结 1、命令模式 餐厅点餐: 创建一个厨师对象,让服务员对象调用厨师对象中的方法进行点餐通知,当后面厨师换人,服务员类的代码也要修改,耦合 不符合开闭。理想状态:服务员…

java SSM农产品订购网站系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM农产品订购网站系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采…

Asp .Net Web Forms 系列:配置图片防盗链的几种方法

通过 URL Rewrite Module 组件 URL Rewrite Module 是一个用于在 ASP.NET Web Forms 或其他基于 IIS 的 Web 应用程序中重写 URL 的强大工具。这个模块允许你将复杂的、不易于记忆或不利于搜索引擎优化的 URL 转换为更简洁、更友好的格式。通过 URL 重写,你可以提高…

Opencv 插值方法 总结

一、概括 面试的时候问到了一个图,就是如何将一个算子放缩??我第一反应是resize(),但是后来我转念一想,人家问的是插值方式,今天来总结一下 最邻近插值法原理分析及c实现_最临近插值法-CSDN博…

050-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

050-WEB攻防-PHP应用&文件包含&LFI&RFI&伪协议编码算法&无文件利用&黑白盒 #知识点: 1、文件包含-原理&分类&危害-LFI&RFI 2、文件包含-利用-黑白盒&无文件&伪协议 演示案例: ➢文件包含-原理&分类&am…

解决达梦集成 JPA 时表和字段注释注解不生效的问题

前言 最近在做达梦数据库集成 JPA 时,发现使用的表注解和字段注解均未生效(MySQL、Oracle、PostgreSQL中均可以在建表时正常生成相应的注释),经过调试发现解决办法也很简单: 自定义方言类继承自org.hibernate.dialect…

vue3 动态路由及使用动态路由后刷新界面出现空白页或者404

最近编写vue3动态路由的功能遇到了一些问题,处理好了,总结出来,希望能帮助到你。正片开始 先写好本地缓存菜单的方法(存储、删除、获取) // utils/menu.jsconst getMenuList () > {return JSON.parse(localStorag…

C语言——简易版扫雷

目录 前言 ​编辑 游戏规则 游戏结构的分析 游戏的设计 使用多文件的好处有以下几点: 游戏代码实现 框架(test.c) game函数(test.c) InitBoard初始化(game.c) Print打印棋盘(g…

【物联网设备端开发】FastBee Arduino固件开发指南

目录 一、收集数据 二、打开FastBeeArduino 源码 三、修改 Config.cpp 文件 四、修改物模型数据 五、小程序配网 本文以 WeMOS D1 R1(8266WIFI 模块)固件开发为例,实现以下功能: 设备认证设备 Mqtt 交互Wifi 类设备配网 一…

vue学习笔记23-组件事件⭐

组件事件 在组件的模板表达式中,可以直接使用$emit方法触发自定义事件;触发自定义事件的目的是组件之间传递数据 好好好今天又碰到问题了,来吧来吧 测试发现其他项目都可以 正常的run ,就它不行 搜索发现新建项目并进入以后,用指…

搭建mysql主从复制(主主复制)

1:设主库允许远程连接(注意:设置账号密码必须使用的插件是mysql_native_password,其他的会连接失败) #切换到mysql这个数据库,修改user表中的host,使其可以实现远程连接 mysql>use mysql; mysql>update user se…

使用C#创建服务端Web API

前言 C# Web API 是一种基于 .NET 平台(包括但不限于.NET Framework 和 .NET Core)构建 HTTP 服务的框架,用于创建 RESTful Web 服务。REST(Representational State Transfer)是一种软件架构风格,它利用HT…

linux中查看目录文件(ls)用法:

查看目录下的文件:ls(list) 作用 查看目录下的内容 格式 ls -参数 操作对象参数 参数功能-l以长格形式显示文件和目录的详细信息,ls命令默认只显示名称的短格式。-d显示指定目录本身的信息,而不显示目录下的各个文件和子目录的信息。-…