当前位置: 首页 > news >正文

MySQL 基础面试题02(事务索引)

1.什么是 MySQL 事务?

MySQL 事务是指一组操作,是一个不可分割的工作单位,可以确保一组数据库操作要么全部执行,要么全部不执行。换句话说,事务是 MySQL 中保证数据一致性和完整性的机制。

在 MySQL 中,事务可以用来保证数据库中数据的一致性和完整性,例如在向数据库中插入或更新一组数据时,要么所有数据插入或更新成功,要么所有操作全部回滚,保持数据的原样。

2.MySQL 事务的 ACID 特性是什么?

ACID 是事务处理中的关键概念,它指的是:

  1. 原子性(Atomicity):指事务中的操作要么全部执行成功、要么全部失败回滚,不会出现部分执行的情况。

  2. 一致性(Consistency):指在事务开始和结束后,数据库的完整性约束没有被破坏,也就是说事务执行前后都需要满足一些预定义的约束条件。

  3. 隔离性(Isolation):指一个事务中的执行不受其他并发事务的影响,它们之间是相互隔离的。

  4. 持久性(Durability):指在事务提交之后,对数据的更新就被永久写入数据库,即使数据库出现故障也能够恢复。

3.什么是隔离级别?MySQL 支持哪些隔离级别?

隔离级别(Isolation Level)是指在并发情况下,不同事务之间对数据库操作数据的可见性和影响范围的规定。 MySQL 支持以下四种隔离级别:

  1. 读未提交(Read Uncommitted):一个事务所做的修改,即使没有提交,对其他事务也是可见的。在这种隔离级别下可能会出现脏读和不可重复读问题。

  2. 读已提交(Read Committed):一个事务所做的修改,在提交后才会对其他事务可见,同样可能会出现不可重复读问题。

  3. 可重复读(Repeatable Read):保证了在同一个事务中对同一数据的读取是一致的,不受其他事务的影响。但是,可能会出现幻读问题。

  4. 序列化(Serializable):最严格的隔离级别,它通过对所有事务进行串行化执行来保证事务的隔离性。这种隔离级别能够避免所有并发问题,但是会对数据库性能产生较大影响。

在选择隔离级别时,需要根据应用的实际情况和数据安全性要求来选择,即需要权衡数据安全性和数据库性能。通常情况下,可重复读已经能够满足大部分应用需求。

4.如何启用或禁用 MySQL 的自动提交?

MySQL 默认自动提交,也就是每条 SQL 语句执行完之后都会自动提交事务。如果要禁用自动提交,需要使用以下语句:

SET autocommit=0;

如果你想启用自动提交,可以使用以下语句:

SET autocommit=1;

你也可以通过配置文件的方式来开启或禁用 MySQL 的自动提交,默认情况下 autocommit 参数为开启状态。

5.MySQL 中如何开始和提交事务?

要将一系列 SQL 语句封装到一个事务中,你需要使用 START TRANSACTION 开始事务,并使用 COMMIT 提交事务。下面是一个例子:

START TRANSACTION;
UPDATE table1 SET column1 = value1 WHERE id = 1;
UPDATE table2 SET column2 = value2 WHERE id = 2;
COMMIT;

在这个例子中,我们在两个表中更新了数据,并将这些操作封装在了一个事务中。只有在所有的更新操作都执行成功后,才会使用 COMMIT 提交整个事务,否则会撤销所有更新操作并回滚到事务开始前的状态。

如果你需要回滚一个事务,可以使用 ROLLBACK 命令。如果你希望回滚到事务开始前的状态,可以使用以下命令:

ROLLBACK;

如果你只想回滚到某个特定的保存点(Savepoint),可以使用以下命令:

ROLLBACK TO savepoint_name;

可以通过 SAVEPOINT 命令来创建保存点,例如:

SAVEPOINT savepoint_name;

这样就可以在事务的执行过程中创建多个不同的保存点,并能在需要时使用它们回滚事务。

6.如何回滚 MySQL 中的事务?

回滚 MySQL 中的事务可以使用 ROLLBACK 命令。如果要回滚整个事务,可以执行以下命令:

ROLLBACK;

这将撤销所有尚未提交的事务,使数据库返回到事务开始之前的状态。

如果您希望回滚指定的保存点,可以使用以下命令:

ROLLBACK TO savepoint_name;

在这种情况下,MySQL 将回滚到指定的保存点,并将所有从该保存点开始的 SQL 语句撤消,然后返回到保存点的状态。

你还可以使用 COMMIT 命令提交事务,将事务中所有的更改保存到数据库中。需要注意的是,如果在提交事务之前执行了 ROLLBACK 命令,将会撤销所有未提交的更改,因此最好每次提交前都对事务进行仔细检查。

7.什么是索引?在 MySQL 中有哪些常见的索引类型?

索引是一种数据结构,可以帮助我们快速定位表中的数据。在 MySQL 中,常见的索引类型包括:

  1. B-Tree 索引:最常用的索引类型。在 B-Tree 索引中,数据按照固定的排序存储在树结构中,查询时可以快速地跳跃到相关的数据。

  2. 哈希索引:使用哈希函数将索引列的值映射为哈希值,然后根据哈希值进行查找。哈希索引适用于等值查询,但不适用于范围查询。

  3. 全文索引:在文本数据类型上创建索引,支持模糊查询和高级查询。只有 InnoDB 存储引擎支持全文索引。

  4. 空间索引:在空间数据类型上创建索引,可以支持地理位置等空间查询。

此外,还有前缀索引、联合索引等其他类型的索引。每种索引类型有其适用的场景和使用方法,需要根据具体情况选择合适的索引类型。

8.什么情况下应该为表中的列创建索引?

通常情况下,应该为需要经常进行查询的列创建索引,特别是那些数据量较大的列。使用索引可以显著提高查询效率。但是,在创建索引的时候,需要注意索引会增加数据表的存储空间和数据修改的成本,因此不能为所有列都创建索引。

以下是创建索引的一些建议:

  1. 主键应该是唯一的,且自动递增的,因此默认会创建主键索引。
  2. 对经常用于搜索条件的列进行索引,如where和join语句中使用的列。
  3. 列值不重复或者重复很少的列上创建索引,如性别、状态等列。
  4. 对经常需要排序的列进行索引。

需要注意的是,索引并不是万能的,也并不是越多越好。在数据量比较小的情况下,无索引查询的效率可能比使用索引还要高;在数据修改和写入比较频繁的表中,创建过多的索引会影响数据的修改和写入性能,因此需要权衡索引的使用和维护成本,选择合适的索引策略。

9.什么是覆盖索引?

覆盖索引是指一个索引包含了查询所需的所有列数据,因此在查询时可以直接使用索引返回结果,而不需要回到数据表中查找数据行,从而大幅提高查询性能。

举个例子,假设有一张订单表,包含了订单编号、订单金额、订单日期等列,如果我们需要查询某个日期范围内的所有订单金额,我们可以在订单日期列上创建一个索引,如果该索引还包含了订单金额列,那么查询时就可以直接使用这个索引返回查询结果,而不需要再回到订单表中查找对应的订单金额,这就是覆盖索引。

可以看出,覆盖索引可以大幅提高查询性能,尤其是在大数据量的情况下。但是,在创建覆盖索引时需要注意,索引需要包含查询所需的所有列数据,因此索引的大小可能会比较大,从而增加读取磁盘的成本,也需要权衡创建索引的成本和查询性能的提高。

10.MySQL 中如何查看表的索引信息?

在MySQL中可以通过 DESC 命令查看表的索引信息,具体操作如下:

  1. 连接到 MySQL 数据库服务器
mysql -u 用户名 -p
  1. 选择需要查看索引信息的数据库
USE 数据库名;
  1. 查看表的结构和索引信息
DESC 表名;

结果会显示出表中每个列的详细信息,以及该表上的每个索引包含的列信息、索引类型等。

  1. 或者使用 SHOW INDEX 命令查看
SHOW INDEX FROM 表名;

结果会显示出当前表所有的索引信息,包括索引名称、列名、索引类型、索引方法、索引所在位置、索引是否唯一等信息。

通过上述命令,可以查看表的索引信息,帮助我们优化查询性能和创建更有效的索引。

11.什么是最左前缀原则?

最左前缀原则是 MySQL 使用索引进行查询的一种规则。它指的是如果一个复合索引包含多个列,那么在查询时只有使用了索引中的最左边的列,索引才能发挥作用。也就是说,索引的列顺序非常重要,只有在最左边的列被使用时,查询才能在索引中快速定位数据。

举个例子,假如我们有一个复合索引包含 name 和 age 两列,如果我们想查询 name=‘Tom’ and age=18 的数据,那么只有在使用 name 这一列的情况下,索引才会被使用。如果查询使用了 age 列,那么索引就无法发挥作用,这时 MySQL 会扫描整张表进行查询,效率会变得非常低下。

因此,在设计索引时要考虑使用最左前缀原则,将最常用的列放在最左边。这样可以使索引更加高效,查询速度更快。

相关文章:

MySQL 基础面试题02(事务索引)

1.什么是 MySQL 事务? MySQL 事务是指一组操作,是一个不可分割的工作单位,可以确保一组数据库操作要么全部执行,要么全部不执行。换句话说,事务是 MySQL 中保证数据一致性和完整性的机制。 在 MySQL 中,事…...

主从架构lua脚本-Redis(四)

上篇文章介绍了rdb、aof持久化。 持久化RDB/AOF-Redis(三)https://blog.csdn.net/ke1ying/article/details/131148269 redis数据备份策略 写job每小时copy一份到其他目录。目录里可以保留最近一个月数据。把目录日志保存到其他服务器,防止机…...

maven与idea版本适配问题

maven与idea版本适配问题 1.版本对应关系——3.6.3 注意:针对一些老项目 还是尽量采用 3.6.3版本,针对idea各个版本的兼容性就很兼容 0.IDEA 2022 兼容maven 3.8.1及之前的所用版本 1.IDEA 2021 兼容maven 3.8.1及之前的所用版本 2.IDEA 2020 兼容Mave…...

ChatGPT扫盲知识库

本文并不是教你如何使用ChatGPT,而是帮助小白理清一些与ChatGPT相关的概念,并解释一些常见的问题。 概念 OpenAI: 一家人工智能公司,ChatGPT属于该公司的产品之一。前身是一个非盈利组织,不过目前已经转变为一家商业公司。 GPT: O…...

chatgpt赋能python:Python轨迹可视化:用数据讲故事

Python轨迹可视化:用数据讲故事 介绍 随着物联网、智能城市等领域的发展,越来越多的数据被收集下来并存储在数据库中。这些数据对于决策者来说是非常重要的,但是如何将这些数据进行展示和分析呢?这时候Python轨迹可视化就可以派…...

K-means

K-means 主要缺点:对于高维度数据,用kmeans方法可能会受到数据形态的影响,其假设高维数据呈球形分布。...

归并排序(基础+提升)

目录 归并排序的理论知识 归并排序的实现 merge函数 递归实现 递归改非递归 归并排序的性能分析 题目强化 题目一:小和问题 题目二:求数组中的大两倍数对数量 题目三:LeetCode_327. 区间和的个数 归并排序的理论知识 归并排序&…...

MATLAB应用

目录 网站 智能图像色彩缩减和量化 网站 https://yarpiz.com/ 智能图像色彩缩减和量化 使用智能聚类方法:(a)k均值算法,(b)模糊c均值聚类(FCM)和(c)自组织神…...

LeetCode --- 1784. Check if Binary String Has at Most One Segment of Ones 解题报告

Given a binary string s ​​​​​without leading zeros, return true​​​ if s contains at most one contiguous segment of ones. Otherwise, return false. Example 1: Input: s = "1001" Output: false Explanation: The ones do not form a contiguous s…...

js:javascript中的事件体系:常见事件、事件监听、事件移除、事件冒泡、事件捕获、事件委托、阻止事件

参考资料 事件介绍Element事件 目录 常见的事件鼠标事件键盘事件Focus events 添加事件监听方式一:addEventListener()(推荐)方式二:事件处理器属性方式三:内联事件处理器(不推荐) 移除监听器方…...

【数据结构】特殊矩阵的压缩存储

🎇【数据结构】特殊矩阵的压缩存储🎇 🌈 自在飞花轻似梦,无边丝雨细如愁 🌈 🌟 正式开始学习数据结构啦~此专栏作为学习过程中的记录🌟 文章目录 🎇【数据结构】特殊矩阵的压缩存储&#x1f38…...

在layui中使用vue,使用vue进行页面数据部分数据更新

layui是一款非常优秀的框架,使用也非常的广泛,许多后台管理系统都使用layui,简单便捷,但是在涉及页面部分数据变化,就比较难以处理,比如一个页面一个提交页,提交之后部分数据实时进行更新&#…...

Vue中如何进行数据导入与Excel导入

Vue中如何进行数据导入与Excel导入 Vue是一款非常流行的JavaScript框架,它提供了一套用于构建用户界面的工具和库。在Vue中,我们可以使用多种方式来导入数据,包括从服务器获取数据、从本地存储获取数据、从文件中读取数据等等。其中&#xf…...

git 的基本操作

1. git建立本地仓库 在想要建立的目录下输入命令 git init 我们可以看一下 .git目录下有什么 2. 配置git本地仓库 配置用户的 name 和 email 命令:git config [...] 配置完后,我们像查看一下 刚才的配置 2.1 查看配置命令 git config -l 2.2 删除…...

搭建Vue项目以及项目的常见知识

前言:使用脚手架搭建vue项目,使用脚手架可以开发者能够开箱即用快速地进行应用开发而开发。 搭建 #创建一个基于 webpack 模板的新项目 vue init webpack my-project #选择所需要的选项如图: cd my-project npm run dev访问localhost:808…...

TypeScript ~ TS Webpack构建工具 ⑦

作者 : SYFStrive 博客首页 : HomePage 📜: TypeScript ~ TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &…...

Rust 自建HTTP Server支持图片响应

本博客是在杨旭老师的 rust web 全栈教程项目基础上进行修改,支持了图片资源返回,杨旭老师的rust web链接如下: https://www.bilibili.com/video/BV1RP4y1G7KFp1&vd_source8595fbbf160cc11a0cc07cadacf22951 本人默认读者已经学习了相关…...

[游戏开发][Unity]UnityWebRequest使用大全

首先记录个小问题 使用new UnityWebRequest的方式,最终的downloadHandler是个null 使用UnityWebRequest.Get的方式,最终的downloadHandler会是DownloadHandlerBuffer 从网站或本地下载内容,包括文本或二进制数据 IEnumerator downloadfile(st…...

如何使用Fiddler对手机进行弱网测试?(干货教程)

1.首先,fiddler连接手机 1)Tools->Options->Connections->设置端口8888,勾选Allow remote computers to connect 2)配置手机 注:手机和电脑需要在同一局域网下 手机进入网络详情,将代理改为手动 设置主机名、端口 主机…...

专业科普:什么是单片机?

一、什么是单片机 单片机诞生于20世纪70年代末,它是指一个集成在一块芯片上的完整计算机系统。单片机具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器&#xff…...

深度学习-第T11周——优化器对比实验

深度学习-第T11周——优化器对比实验 深度学习-第T11周——优化器对比实验一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目3、查看数据 四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签 2、数据可视化3、检查数据4、配置数据集…...

基于Dlib的疲劳检测系统

需要源码的朋友可以私信我 基于Dlib的疲劳检测系统 1、设计背景及要求2、系统分析3、系统设计3.1功能结构图3.2基于EAR、MAR和HPE算法的疲劳检测3.2.1基于EAR算法的眨眼检测3.2.2基于MAR算法的哈欠检测3.3.3基于HPE算法的点头检测 4、系统实现与调试4.1初步实现4.2具体实现过程…...

three.js通过CubeTexture加载环境贴图,和RGBELoader加载器加载hdr环境贴图

一、使用CubeTexture进行环境贴图 1.CubeTexture使用介绍 Three.js中可以通过使用CubeTexture进行环境贴图,CubeTexture需要将6张图片(正面、反面、上下左右)包装成一个立方体纹理。下面是一个简单的例子: 首先需要加载六张贴图…...

pycharm中Terminal输入sqlite3,出现无法将sqlite项识别为cmdlet**的解决方法

前提:本机上已安装sqlite3,安装详见:pycharm社区版中安装配置sqlite3_Sunshine_0426的博客-CSDN博客 问题: cmd命令行中或pycharm中Terminal行输入sqlite3 db.sqlite3命令后,出现“无法将“sqlite3”项识别为 cmdlet…...

VSCode 安装配置教程详解包含c++环境配置方法

vscode安装教程及c环境配置详解 vscode下载安装下载C扩展插件VScode C环境配置配置环境变量检查 MinGW 安装配置编译器:配置构建任务检查是否安装了编译器配置完毕 vscode下载安装 地址:官网下载地址 直接打开下载好的.exe文件进行安装即可&#xff0…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示(C#) Baumer工业相机Baumer工业相机BGAPISDK和图像放大缩小的技术背景Baumer工业相机通过BGAPISDK将相机图像图像放大缩小功能1.引用合适的类文件2.通过BGAPISDK将相机图像图像放大缩小功能…...

8.1 PowerBI系列之DAX函数专题-进阶-解决列排序对计算的影响

需求 下列矩阵中,在月份列不按照原始数据的month_no排列时,能正确计算销售额占比,但是当月份按照month_no排序时就会出错,需要解决这个问题。 实现 month % divide([amount],calculate([amount],all(date[month desc]))) //排…...

Java的第十二篇文章——集合

目录 第十二章 集合 学习目标 1. 集合框架的由来 2. 集合框架的继承体系 3. Collection接口 3.1 Collection接口的常用方法 4. Iterator接口 4.1 Iterator接口的抽象方法 4.2 获取迭代器接口实现类 4.3 迭代器的实现原理 4.4 并发修改异常 4.5 集合存储自定义对象并…...

docker 镜像制作 与 CI/CD

目录 镜像到底是什么? 使用docker创建镜像 步骤: 1、编辑Dockerfile(Dockerfile是docker制作镜像的配方文件) 2、编辑requirements.txt文件 3、编辑app.py文件,我们的程序文件 4、生成镜像文件 5、查看生成的镜…...

Spring Boot 异常报告器解析

基于Spring Boot 3.1.0 系列文章 Spring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解Spring Boot 监听器详解Spring Boot banner详解Spring Boot 属性配置解析Spring Boot 属性加载原理解析Spring Boot 异常报告器解析 创建自定…...