面试八股文--数据库基础知识总结(2) MySQL

news/2025/2/26 4:42:04

本文介绍关于MySQL的相关面试知识

一、关系型数据库

1、定义

关系型数据库(Relational Database)是一种基于关系模型数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格之间的关系来组织和管理数据。

2、常见的关系型数据库

  • MySQL:开源的、高性能的关系型数据库,适用于Web应用和中小型企业。

  • PostgreSQL:开源的、功能强大的关系型数据库,支持复杂的数据类型和高级功能。

  • Oracle Database:商业级的高性能数据库,适用于大型企业和高并发场景。

  • Microsoft SQL Server:商业级的数据库系统,与Windows环境和.NET框架集成良好。

  • SQLite:轻量级的嵌入式数据库,适用于小型应用和移动设备。

二、MySQL

1、为什么还要用到MySQL,MySQL有什么优点?

  • 成熟稳定,功能完善。
  • 开源免费。
  • 文档丰富,既有详细的官方文档,又有非常多优质文章可供参考学习。
  • 开箱即用,操作简单,维护成本低。
  • 兼容性好,支持常见的操作系统,支持多种开发语言。
  • 社区活跃,生态完善。
  • 事务支持优秀, InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失,并且,InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的。
  • 支持分库分表、读写分离、高可用

2、MySQL有哪些数据类型?

  • 数值类型
数据类型存储大小(字节)描述/范围(有符号)
TINYINT1-128 到 127
SMALLINT2-32768 到 32767
MEDIUMINT3-8388608 到 8388607
INT 4-2147483648 到 2147483647
BIGINT8-9223372036854775808 到 9223372036854775807
FLOAT单精度浮点数
DOUBLE 双精度浮点数
DECIMAL用于存储精确的小数定点数类型
  • 字符串类型
数据类型描述
VARCHAR可变长度字符串,最大长度为 65535 字节(取决于字符集)。
CHAR固定长度字符串,最大长度为 255 字节。
TEXT用于存储较大的文本数据,最大长度为 65535 字节。
MEDIUMTEXT最大长度为 16777215 字节。
LONGTEXT最大长度为 4294967295 字节。
BLOB用于存储二进制数据,最大长度为 65535 字节。
MEDIUMBLOB最大长度为 16777215 字节。
LONGBLOB最大长度为 4294967295 字节。
  •  日期和时间类型
数据类型描述
DATE日期值,格式为 YYYY-MM-DD
TIME时间值,格式为 HH:MM:SS
DATETIME日期和时间值,格式为 YYYY-MM-DD HH:MM:SS
TIMESTAMP时间戳,表示从 1970-01-01 00:00:00 UTC 开始的秒数。
YEAR年份值,可以是 2 位或 4 位格式。

3、MySQL索引

(1)索引的介绍

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。

索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。

(2)索引的底层结构

  • 二叉查找树(BST)

二叉查找树(Binary Search Tree,简称BST)是一种特殊的二叉树,它具有以下性质:

  1. 每个节点包含一个键值(key)和两个子树的引用(左子树和右子树)。

  2. 左子树上所有节点的键值都小于其根节点的键值。

  3. 右子树上所有节点的键值都大于其根节点的键值。

  4. 左子树和右子树也都是二叉查找树。

索引为什么不选择二叉树?当二叉查找树是平衡的时候,也就是树的每个节点的左右子树深度相差不超过 1 的时候,查询的时间复杂度为 O(log2(N)),具有比较高的效率。然而,当二叉查找树不平衡时,例如在最坏情况下(有序插入节点),树会退化成线性链表(也被称为斜树),导致查询效率急剧下降,时间复杂退化为 O(N)。

  • 红黑树

红黑树是一种自平衡二叉查找树,通过在插入和删除节点时进行颜色变换和旋转操作,使得树始终保持平衡状态,它具有以下特点:

  1. 每个节点非红即黑;
  2. 根节点总是黑色的;
  3. 每个叶子节点都是黑色的空节点(NIL 节点);
  4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
  5. 从任意节点到它的叶子节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。

HashMap 底层用的就是红黑树,它的增删改查性能都很好,但数据库的索引依旧不用它,这是由于红黑树的平衡性相对较弱,可能会导致树的高度较高,这可能会导致一些数据需要进行多次磁盘 IO 操作才能查询到。

  • B树&B+树(多叉平衡搜索树)

在 B 树中,一个节点可以有许多个数据,并且它们按序排列起来。不仅如此,原来二叉树中每个节点最多有两个分支,而 B 树中,每个节点可以有很多很多分支。它具有以下特点:

  1. 叶节点具有相同的深度,叶节点的指针为空
  2. 所有索引元素不重复
  3. 节点中的数据索引从左到右递增排列

 

 为什么不用B树呢?B 树虽然好,但它也存在一些问题:查询效率不太稳定,有些在根节点或者根节点附近就能找到,搜索起来就很快。有些在叶子节点上,那查询起来就很慢。

B+树的特点:

  1. 非叶子节点不存储 data,只存储索引(冗余),可以放更多的索引
  2. 叶子节点包含所有索引字段
  3. 叶子节点用指针连接,提高区间访问的性能

 

B+ 树在 B 树基础上做了进一步优化,将数据全部放在叶子节点上。这样不管查询哪个数据,最终都要走到叶子节点,从而解决了查询性能不稳定的问题。 

Q:B树和B+树有什么不同呢?

  1. 节点存储数据的方式B树:每个节点既可以存储键值,也可以存储数据记录(或指向数据记录的指针)。数据可以分布在树的任意节点中。而B+树:只有叶节点存储数据记录(或指向数据记录的指针),非叶节点仅存储键值用于索引。这种设计使得B+树的非叶节点只用于引导查找,而数据访问集中在叶节点。

  2. 叶节点结构B树:叶节点之间没有直接的连接。B+树:叶节点之间通过指针连接成一个双向链表。这种结构使得范围查询更加高效,因为可以直接在叶节点链表中顺序扫描。

  3. 空间利用率B树:由于数据分散在各个节点,可能导致空间利用率较低,尤其是在频繁更新数据时。B+树:由于所有数据都集中在叶节点,非叶节点只存储键值,因此空间利用率更高,更适合存储大量数据。

  4. 查找效率B树:对于单点查询效率较高,因为数据可能在任意节点。B+树:对于范围查询效率更高,因为所有数据都在叶节点,且叶节点通过链表连接,便于顺序扫描。

  5. 插入和删除操作B树:插入和删除操作可能涉及多个节点的调整,因为数据分布在树的各个节点。B+树:插入和删除操作主要集中在叶节点,非叶节点的调整相对较少,因此更适合频繁更新的场景

4、MySQL事务

(1)事务的概念和特性 

什么是事务?MySQL的事务是逻辑上的一组操作,要么都执行,要么都不执行。

它具有以下四个核心特性,通常被称为ACID特性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不做,不会出现部分完成的情况。

  • 一致性(Consistency):事务执行前后,数据库必须从一个一致的状态转换到另一个一致的状态。例如,转账操作中,金额的总和在事务前后必须保持不变。

  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应受到其他事务的干扰。MySQL提供了不同的隔离级别来控制事务之间的可见性。

  • 持久性(Durability):事务一旦提交,其对数据库的更改就是永久性的,即使系统故障也不会丢失。

(2)多事务并发产生的问题

  • 脏读:一个事务1读取数据并且对数据进行了修改,这个修改对其他事务来说是可见的,即使当前事务没有提交。这时另外一个事务2读取了这个还未提交的数据,但事务1突然回滚,导致数据并没有被提交到数据库,那事务2读取到的就是脏数据,这也就是脏读的由来。

  • 不可重复读: 事务1执行过程中,若对同一条数据进行两次读取,在这两次读取之间,事务2修改了这条数据,并且进行了完整提交。A事务的两次读取,却读到了两次不同的数据。

  •  幻读:幻读与不可重复读类似。它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

(3)并发事务的控制方式

 MySQL 中并发事务的控制方式无非就两种:MVCC。锁可以看作是悲观控制的模式,多版本并发控制(MVCC,Multiversion concurrency control)可以看作是乐观控制的模式。

控制方式下会通过锁来显式控制共享资源而不是通过调度手段,MySQL 中主要是通过 读写锁 来实现并发控制。

  • 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
  • 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条记录加任何类型的锁(锁不兼容)。

读写锁可以做到读读并行,但是无法做到写读、写写并行。另外,根据根据锁粒度的不同,又被分为 表级锁(table-level locking)行级锁(row-level locking) 。InnoDB 不光支持表级锁,还支持行级锁,默认为行级锁。行级锁的粒度更小,仅对相关的记录上锁即可(对一行或者多行记录加锁),所以对于并发写入操作来说, InnoDB 的性能更高。不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)这两类。

MVCC 是多版本并发控制方法,即对一份数据会存储多个版本,通过事务的可见性来保证事务能看到自己应该看到的版本。通常会有一个全局的版本分配器来为每一行数据设置版本号,版本号是唯一的。

(4)事务的隔离级别

隔离级别脏读不可重复读幻读脏写(更新丢失
Read Uncommit(读未提交)会出现会出现会出现第二类
Read Commit(读已提交)解决会出现会出现第二类
Repeatable Read(可重复读,默认)解决解决会出现解决
Serializable(串行)解决解决解决解决

 可串行化原理:对于 select 查询语句,会自动给这条记录加上共享锁(S 锁),此时其他线程就只能读,因为共享锁之间相互兼容(S锁还可以加S锁),但修改操作会被阻塞,以此实现可串行化的效果。对于 update、delete、insert 语句,会自动加一把排他锁(X 锁加了之后不允许加其他锁),此时其他线程什么都做不了,只能被阻塞,因为排他锁和其他锁都互斥,以此实现可串行化的效果


都看到这里了,给个小心心♥呗~


http://www.niftyadmin.cn/n/5867157.html

相关文章

Ubuntu DeepSeek磁盘空间不够解决办法

标签: Ubuntu; DeepSeek磁盘空间不够解决办法;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题:Ubuntu 22, DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统,台式…

基于keepalived实现haproxy高可用站点

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入VRRP的功 能,VRRP是Virtual Router Redundancy protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就 是为了解决静态路…

基于javaweb的SpringBoot社区维修平台设计和实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

图解前馈神经网络(FNN)

目录 ​编辑 1.前馈神经网络介绍 2.网络结构 3.模型工作示例 4.总结 1.前馈神经网络介绍 前馈神经网络(Feedforward Neural Network,FNN)是一种最简单、最经典的神经网络结构,它是人工神经网络的基础形式之一。 前馈神经网络…

忽略Git文件的修改,让它不被提交

使用Git托管的工程中,经常有这样的需求,希望文件只是本地修改,不提交到服务端。 如果仅仅是本地存在的文件,我们可以通过.gitignore配置避免文件被提交。 有的时候文件是由git托管的,但是我们希望只在本地修改&#…

运行 Rancher 的建议

运行在多个节点上的多个 Rancher 实例确保了单节点环境无法实现的高可用性,所以在生产环境或者一些很重要的环境中部署 Rancher 时,应该使用至少有三个节点的高可用 Kubernetes 集群,并在这个集群上面安装 Rancher。 在专用的集群上运行 Ran…

【Linux网络】序列化、守护进程、应用层协议HTTP、Cookie和Session

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、序列化和反序列化2、守护进程2.1 什么是进程组?2.2 什么是会话? 3、应用层协议HTTP3.1 HTTP协议3.2 HT…

Flutter 布局入门指南:掌握核心技巧,轻松构建精美界面

目录 一、理解 Flutter 布局的核心思想 1. Widget 树与约束传递 2. 常见布局 Widget 分类 二、6 个必学的布局技巧 技巧 1:用 Expanded 和 Flexible 实现弹性空间分配 技巧 2:用 SizedBox 精确控制尺寸 技巧 3:处理内容溢出&#xff0…