y常见面试题知识点总结!(最新版)avauideavauide

内容很硬!强烈建议小伙伴们花 10 分钟左右阅读一遍!

顾名思义,关系型数据库就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多)。

关系型数据库中,我们的数据都被存放在了各种表中(比如用户表),表中的每一行就存放着一条数据(比如一个用户的信息)。

大部分关系型数据库都使用 SQL 来操作数据库中的数据。并且,大部分关系型数据库都支持事务的四大特性(ACID)。

有哪些常见的关系型数据库呢?

MySQL 是一种关系型数据库,主要用于持久化存储我们的系统中的一些数据比如用户信息。

由于 MySQL 是开源免费并且比较成熟的数据库,因此,MySQL 被大量使用在各种系统中。任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL 的默认端口号是3306。

查看 MySQL 提供的所有存储引擎

从上图我们可以查看出 MySQL 当前默认的存储引擎是 InnoDB,并且在 5.7 版本所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。

查看 MySQL 当前默认的存储引擎

我们也可以通过下面的命令查看默认的存储引擎。

查看表的存储引擎

MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默认存储引擎,可谓是风光一时。

虽然,MyISAM 的性能还行,各种特性也还不错(比如全文索引、压缩、空间函数等)。但是,MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。

5.5 版本之后,MySQL 引入了 InnoDB(事务性数据库引擎),MySQL 5.5 版本后默认的存储引擎为 InnoDB。小伙子,一定要记好这个 InnoDB ,你每次使用 MySQL 数据库都是用的这个存储引擎吧?

言归正传!咱们下面还是来简单对比一下两者:

1.是否支持行级锁

MyISAM 只有表级锁(table-level locking),而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

也就说,MyISAM 一锁就是锁住了整张表,这在并发写的情况下是多么滴憨憨啊!这也是为什么 InnoDB 在并发写的时候,性能更牛皮了!

2.是否支持事务

MyISAM 不提供事务支持。

InnoDB 提供事务支持,具有提交(commit)和回滚(rollback)事务的能力。

3.是否支持外键

MyISAM 不支持,而 InnoDB 支持。

🌈 拓展一下:

一般我们也是不建议在数据库层面使用外键的,应用层面可以解决。不过,这样会对数据的一致性造成威胁。具体要不要使用外键还是要根据你的项目来决定。

4.是否支持数据库异常崩溃后的安全恢复

MyISAM 不支持,而 InnoDB 支持。

使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 redo log 。

🌈 拓展一下:

5.是否支持 MVCC

MyISAM 不支持,而 InnoDB 支持。

讲真,这个对比有点废话,毕竟 MyISAM 连行级锁都不支持。

MVCC 可以看作是行级锁的一个升级,可以有效减少加锁操作,提供性能。

大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。不过,前提是你的项目不介意 MyISAM 不支持事务、崩溃恢复等缺点(可是~我们一般都会介意啊!)。

《MySQL 高性能》上面有一句话这样写到:

不要轻易相信“MyISAM 比 InnoDB 快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。

一般情况下我们选择 InnoDB 都是没有问题的,但是某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择 MyISAM 也是一个不错的选择。但是一般情况下,我们都是需要考虑到这些问题的。

因此,对于咱们日常开发的业务系统来说,你几乎找不到什么理由再使用 MyISAM 作为自己的 MySQL 数据库的存储引擎。

MyISAM 和 InnoDB 存储引擎使用的锁:

表级锁和行级锁对比:

InnoDB 存储引擎的锁的算法有三种:

执行查询语句的时候,会先查询缓存。不过,MySQL 8.0 版本后移除,因为这个功能不太实用

MySQL 执行以下命令也可以开启查询缓存

如上,开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。因此任何两个查询在任何字符上的不同都会导致缓存不命中。此外,如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果也不会被缓存。

缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。 因此,开启查询缓存要谨慎,尤其对于写密集的应用来说更是如此。如果开启,要注意合理控制缓存空间大小,一般来说其大小设置为几十 MB 比较合适。此外,还可以通过 sql_cache 和 sql_no_cache 来控制某个查询语句是否需要缓存:

一言蔽之,事务是逻辑上的一组操作,要么都执行,要么都不执行。

可以简单举一个例子不?

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账 1000 元,这个转账会涉及到两个关键操作就是:

事务会把这两个操作就可以看成逻辑上的一个整体,这个整体包含的操作要么都成功,要么都要失败。

这样就不会出现小明余额减少而小红的余额却并没有增加的情况。

数据库事务在我们日常开发中接触的最多了。如果你的项目属于单体架构的话,你接触到的往往就是数据库事务了。

平时,我们在谈论事务的时候,如果没有特指分布式事务,往往指的就是数据库事务。

那数据库事务有什么作用呢?

简单来说:数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部不执行 。

另外,关系型数据库(例如:MySQL、SQL Server、Oracle 等)事务都有 ACID 特性:

数据事务的实现原理呢?

我们这里以 MySQL 的 InnoDB 引擎为例来简单说一下。

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性。

MySQL InnoDB 引擎通过 锁机制、MVCC 等手段来保证事务的隔离性( 默认支持的隔离级别是 REPEATABLE-READ )。

保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

不可重复读和幻读区别:

不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。

SQL 标准定义了四个隔离级别:

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看,MySQL 8.0 该命令改为SELECT @@transaction_isolation;

这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 REPEATABLE-READ(可重读) 事务隔离级别下使用的是 Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说 InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL 标准的 SERIALIZABLE(可串行化) 隔离级别。

🐛 问题更正:MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是 Next-Key Locks。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED(读取提交内容) ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读) 并不会有任何性能损失。

InnoDB 存储引擎在 分布式事务 的情况下一般会用到 SERIALIZABLE(可串行化) 隔离级别。

🌈 拓展一下(以下内容摘自《MySQL 技术内幕:InnoDB 存储引擎(第 2 版)》7.7 章):

InnoDB 存储引擎提供了对 XA 事务的支持,并通过 XA 事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transactional resources)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。另外,在使用分布式事务时,InnoDB 存储引擎的事务隔离级别必须设置为 SERIALIZABLE。

对于你学习 Java 以及准备 Java 方向的面试都很有帮助!正如作者说的那样,这是一份:涵盖大部分 Java 程序员所需要掌握的核心知识的 Java 学习+面试指南!

THE END
0.数据库知识点总结mysql教程数据库知识点总结 一、相关概念和知识点 1. 数据依赖 :反映一个关系内部属性与属性之间的约束关系,是现实世界属性间相互联系的抽象,属于数据内在的性质和语义的体现。 2. 规范化理论 :是用来设计良好的关系模式的基本理论。它通过分解关系模式来消除其中不合适的数据依赖jvzq<84rjr4dp8r{usr.v~yqtkgmu66389>80qyon
1.SQLServer索引基础知识(1)SQL Server 索引基础知识(1)--- 记录数据的基本格式 作者:郭红俊 由于需要给同事培训数据库的索引知识,就收集整理了这个系列的博客。发表在这里,也是对索引知识的一个总结回顾吧。通过总结,我发现自己以前很多很模糊的概念都清晰了很多。 不论是缓存的数据信息,还是物理保存的信息,他们的基本单位都是数据页。所以理jvzquC41oujo0vnetqyph}3eqo5{j6hp1fj48A5440gtr
2.《数据库技术及应用》教学大纲记忆数据库技术基础理论知识,记忆数据库和表的基本操作,记忆SQL语言基本功能语句编写,记忆结构化程序设计基本理论和编程知识,记忆面向对象的可视化程序设计知识,了解应用程序开发的基本步骤和注意事项。 (二)能力目标 培养学生数据库技术基础理论及操作的能力,能够进行基本数据库操作,具备基本的程序设计能力,能够设计基本的jvzquC41ii}t{pqz{0h{ol3gfw4dp8723:523:;1e3=49j:29:<0rjlg0jzn
3.数据库基础SQL 的知识点总结 一、数据库的基本内容 数据库:存储在计算机内大量数据的集合 数据库系统:指计算机引入数据之后的系统 数据库管理系统:用于管理用户和系统之间的数据 字段:数据库形成的数据表的列的称呼 1.数据库的分类:关系数据库和非关系数据库 关系型数据库:使用行列表格的模式,代表:SQL、SQL Server、jvzquC41dnuh0lxfp0tfv8r2a7>45@6451gsvrhng1jfvjnnu1739<:4;:>
4.SQL基础与进阶学习指南SQL基础与进阶学习指南 本文还有配套的精品资源,点击获取 简介:SQL是管理和操作关系数据库的标准语言,涵盖数据类型、表的创建与操作、查询语言、连接操作、子查询、视图、索引、存储过程、函数、事务管理和安全性等多个核心概念。本学习资料旨在帮助初学者和进阶者通过理论与实践相结合的方式深入理解SQL的各个方面,提供jvzquC41dnuh0lxfp0tfv8|gkzooa<:45:>278ftvkimg8igvcomu866;:?52?5
5.SQLserver数据库基础sqlserver数据库基础知识本文全面介绍数据库相关知识,涵盖概念、分类,阐述结构化查询语言特点与功能,讲解数据库设计规范、表间关系。还介绍常用公共字段、数据类型,详细说明表操作、增删改查,以及常用函数和对象,如存储过程和索引等。 SQLserver数据库基础知识 1.数据库的概念 2.数据库的分类 3.结构化查询 4.数据库设计的几个规范 5.数据库中表和jvzquC41dnuh0lxfp0tfv8ykcpsfi:7261gsvrhng1jfvjnnu1746B7275<
6.SQL基础知识点sql字段是什么SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准语言。以下是 SQL 的核心知识点: 1. SQL 基本概念 数据库:用于存储和管理数据的集合。 表(Table):数据库中的数据结构,由行和列组成。 记录(Row):表中的一行数据。 字段(Column):表中的一列数据。 主键(Primary Key):唯一标识表中每条jvzquC41dnuh0lxfp0tfv87523e92<;:64?0c{ykenk0fnyckny03=699;<28
7.史上最全SQL基础知识语法sql语法本文全面介绍了SQL语言的基础知识,包括SQL的基本语法、数据库操作、数据表管理及数据操作等内容。适合初学者快速入门。 文章目录 一、 SQL基本介绍 二、SQL基础 1、SQL基本语法 2、SQL库操作 1) 创建数据库 2) 显示数据库 3) 使用数据库 4) 修改数据库 jvzquC41dnuh0lxfp0tfv8|gkzooa=:876;948ftvkimg8igvcomu863;381;B6