MySQL索引事务及高频面试题

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL索引事务及高频面试题

索引

概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。


索引相等于一本书的目录!!

如果我们需要查找一本书中指定内容!我们先是需要找目录,然后通过目录精准定位到你需要查找的内容!!

显然 目录提高了查找效率!

索引也可以提高我们数据库的查找效率!!!

当想显然一本书如果需要目录那么就需要更多的纸!

而索引便需要更多的内存!!!


作用

数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。

索引所起的作用类似书籍目录,可用于快速定位、检索数据。

索引对于提高数据库的性能有很大的帮助。

所以索引对我们数据库的查找效率提高很大!!!


使用场景

数据量较大,且经常对这些列进行条件查询.

我们什么时候翻一本书的内容需要先翻目录然后再查找呢?

显然那是因为书的内容比较多!书比较厚!!

如果书很薄,那我们其实可以直接查找内容即可!!!

而数据库中的索引也一样!!

如果数据库表中的字段较少!!那么添加索引只会浪费空间!!

当我们数据量较大时,添加索引可以很好的提高查找效率!!!


该数据库表中的插入操作,修改操作比较低.

如果作家斌没有将一本书编辑好,还需要大量更改,那么他肯定不会现将目录创建出来!不然后期要频繁更改目录,甚是麻烦! 如果我们的数据库表,修改和插入频率较低,那么索引表便很好的提高了效率!!!


索引会占用额外的磁盘空间!

使用

我们该如何使用索引表呢?

如何给我们的数据库表创建一个索引呢?


创建主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时,会自动创建对应列的索引。


查看索引:

show index from 表名;

image.png

创建索引表:

对于非主键、非唯一约束、非外键的字段,可以创建普通索引!!!


create index 索引名 on 表名(字段名);


案例:创建班级表中,name字段的索引!

image.png

可以看到 我们成功创建了名为indexname的索引!!!

image.png

删除索引

drop index 索引名 on 表名;

我们将刚刚class_7表中的indexname索引删除!

image.png

索引背后的数据结构

我们想想我们学过的数据结构,啥结构的查找效率高呢,可能大家首先想到的是顺序表!!

显然顺序表,如果按照下标查找效率高!!但是我们数据库中的查找并不是按照下标查找!

这里的查找是按照值查找!!!

值查找那不就是树形结构查找快吗,所以我们索引用的数据结构就是树形结构!

采用多叉树可以减低高度,提高查找效率!!!


B+树


啥是B+树呢?

那么我们不得不介绍一下B树(B-树)这里并不是B减树!!这里只是B树的另外一种写法!

image.png

可以看到B树,结构简单,就是一个节点,有多个key值 多个key值,分成n+1个开区间!

我们通过区间逐步查找,直到根节点即可查到我们需要查找的值!!


image.png


B+就是为了索引而量身打造的!

使用B+查找整体的IO次数大大减少,并且查询稳定,因为树的平衡高,并且每个叶子节点都和其他叶子节点连接!!

叶子节点用链表连接后,非常适合范围查找!!!

所有的数据都保存在叶子节点!!!非叶子节点保存key值即可,占用空间小,甚至可以直接缓存在内存中!!!

事务

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end ransaction语句(或函数调用)来界定。事务由事务开始(begintransaction)和事务结束(end transaction)之间执行的全体操作组成。(百度)


简单讲事务就是MySQL多条操作封装在一起,成为一个事务!!!


也就是多条sql语句就可以组成一个事务!


为什么使用事务

有些MySQL操作,不得不需要多条sql才能执行成功!


比如我们需要转账操作!

显然这样的操作,在mysql需要分两步执行!!!


image.png

如果我们的第一步操作就失败了!显然此时转账失败了!

我们第二步的操作就没有意义了!

所以我们需要将这两个操作打包成一个事务!

如果sql_1执行成功了,那么再执行sql_2!


那如果sql_1执行失败了咋整呢?

放心,我们的mysql数据库有专门的表记录下了sql_1操作,数据库系统会自动将该操作回滚即复原!!!


事务特性:

四大特性:


原子性

因为我们通常认为原子是不可再分的,这里就是认为事务是最小单元了!

一致性

就刚刚的转账操作,账户1和账户2中的余额总数要和转账前相同,不能无故增加或减少!!!

隔离性

多个事务并发之间是隔离的!

就是当,双方转账的同时,另一方再转账给其中一人,那么此时就不可执行!

持久性

执行该条事务后,如果不进行二次更改,那么该数据就持久有效了!


使用

如何设置执行一个事务呢?


开启事务

sql语句

start transaction;

执行多条sql

回滚或提交:

sql语句

rollback/commit;

rollback即是全部失败,commit即是全部成功。

image.png

commit事务提交成功!!

image.png

rollback撤销该事务

并发执行事务可能带来的问题(面试)

我们知道事务有隔离性的特点!!!

我们知道隔离性越好,那么事务之间的并发性就低!!!


什么是并发执行呢?

我们知道我们的计算机可以同时开启多个进程(程序)!

我们可以听着歌,打开IDEA,打开CSDN写博客!!!

我们计算机是很擅长一心多用!!多个进程并发执行!!!

而如今的计算机CPU也是取向多核发展!!

就是同时并发执行的程序可以更多!!


而事务间也有并发!


联系我们生活,很多事情我们可以同时并发执行!但是有些事情需要先后顺序执行,不然会很多问题!!

事务并发也是如此,有可能出现一些问题!


脏读问题

什么是脏读呢?

顾名思义就是读了一个脏数据!就是错误的数据!!


什么情况下会出现脏读呢?


比如高中,考了考试,你正在订正答案,学委在黑板上抄答案,你在你的试卷上改!他写,你抄.你抄完后,发现学委把答案改了,他刚刚抄错答案了! 你刚刚读的答案就是一个脏数据!!!


我们画一个时间轴便于理解!!!

image.png

解决方案:

我们可以对写操作进行加锁!!!便可以处理脏读问题!!!


就是说我们等学委将答案全部抄完! 我们再进行读答案!!!

image.png


不可重复读

当我们学委写完答案,你开始抄答案不久时间后,老师和他说有一个答案有更好的解法!让学委重新写一份!可这时你已经在抄了好多了!你就一整个大无语!!!

image.png


解决方案:

给读操作加锁!


我们和学委商量,他写答案的时候我们不看!我们抄答案的时候他就不可以改了!!!

image.png


幻读问题

当学委写完数学答案后,我们再看数学答案时,他又在写英文答案,此时你就看岔行了!把英文答案看成了数学答案抄了,出现了幻读问题!!!

image.png


解决方案:

再次和学委商量,咱抄答案时他不能写!!!我们抄时他不能写!!!


使读和写操作直接串行化了!!!


显然此时的隔离效果最后!! 但是并发最慢!!!


隔离性和并发两者需要平衡!!!


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
2月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
16天前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
1月前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
25天前
|
SQL 关系型数据库 MySQL
阿里面试:1000万级大表, 如何 加索引?
45岁老架构师尼恩在其读者交流群中分享了如何在生产环境中给大表加索引的方法。文章详细介绍了两种索引构建方式:在线模式(Online DDL)和离线模式(Offline DDL),并深入探讨了 MySQL 5.6.7 之前的“影子策略”和 pt-online-schema-change 方案,以及 MySQL 5.6.7 之后的内部 Online DDL 特性。通过这些方法,可以有效地减少 DDL 操作对业务的影响,确保数据的一致性和完整性。尼恩还提供了大量面试题和解决方案,帮助读者在面试中充分展示技术实力。
|
1月前
|
SQL 算法 关系型数据库
面试:什么是死锁,如何避免或解决死锁;MySQL中的死锁现象,MySQL死锁如何解决
面试:什么是死锁,死锁产生的四个必要条件,如何避免或解决死锁;数据库锁,锁分类,控制事务;MySQL中的死锁现象,MySQL死锁如何解决
|
14天前
|
关系型数据库 MySQL 数据库
MySQL事务隔离级别及默认隔离级别的设置
在数据库系统中,事务隔离级别是一个关键的概念,它决定了事务在并发执行时如何相互隔离。MySQL提供了四种事务隔离级别,每种级别都解决了不同的并发问题。本文将详细介绍这些隔离级别以及MySQL的默认隔离级别。
|
1月前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
29天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?