最新Mysql学习--深入探究索引和事务的重点要点与考点,java高级程序员面试宝典pdf

结语

小编也是很有感触,如果一直都是在中小公司,没有接触过大型的互联网架构设计的话,只靠自己看书去提升可能一辈子都很难达到高级架构师的技术和认知高度。向厉害的人去学习是最有效减少时间摸索、精力浪费的方式。

我们选择的这个行业就一直要持续的学习,又很吃青春饭。

虽然大家可能经常见到说程序员年薪几十万,但这样的人毕竟不是大部份,要么是有名校光环,要么是在阿里华为这样的大企业。年龄一大,更有可能被裁。

送给每一位想学习Java小伙伴,用来提升自己。

在这里插入图片描述

本文到这里就结束了,喜欢的朋友可以帮忙点赞和评论一下,感谢支持!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客

系列专栏:xiaoxie的MySql学习系列专栏——CSDN博客●’ᴗ’σσணღ
我的目标:“团团等我💪( ◡̀_◡́ ҂)”

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

索引和事务,在日后面试中,算是比较高频的考点,在这里博主总结了一些关于索引和事务的重点和要点

目录

一.索引

1.1 概念

1.2作用

1.3核心内容

1.索引有什么作用?

2.索引背后的数据结构

1.以哈希表作为索引

2.以红黑树作为索引

3.b+树为什么适合作为索引

4.B+树相对于B树有以下不同之处

1.4索引查询过程

1.5索引的语法

1.6说明

二.事务

2.1事务的概念

2.2 为什么要使用事务

2.3 事务的流程

2.4面试题:事务的基本特性

1.原子性(Atomicity:

2.一致性(Consistency)

3.持久性

4.隔离性(考察的重点,可以说主要就是考察隔离性)

1.脏读问题

2.不可重复读问题

3.幻读问题

4.总结


一.索引

1.1 概念

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

1.2作用

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

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

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

1.3核心内容

1.索引有什么作用?

我们都知道mysql查找主要是select同时数据库应用最多的也是select,

select基本执行过程,遍历表,依次取出每个记录,根据where字句的条件,决定这个记录要保留还是过滤,像这样的遍历操作,本身是比较低效的(尤其是数据量很大的时候)

为什么特别低效呢?因为把数据存储在硬盘上的,取出每个记录(这个操作都意味访问硬盘) 相比之下,我们更希望访问硬盘的次数尽量少。

索引的作用就在这里了,通过索引背后的数据结构,加快查询表的速度,减少表的遍历,而索引的核心内容就是,其背后的数据结构,

2.索引背后的数据结构

大家都知道,提供查询速度的数据结构有很多,例如其中最典型的哈希表查询的时间复杂度一般我们认为O(1),红黑树查询的时间复杂度为O(logn),这两个都是很好的可以减少查询的数据结构,但为什么索引用的是数据结构为B+树呢,(这是很关键的问题,面试关于Mysql方面的知识很喜欢问这个)

1.以哈希表作为索引

我们以 key-value 数据的索引为基础,假设数据存储全部采用追加式的文件组成,那么最简单的索引策略,莫过于把每个 key 对应文件中的字节偏移量(也就是在文件中的位置),保存到内存中的哈希表中(Hashtable 或 HashMap),这样就可以快速找到每个值的位置。

每当向数据库追加新的 key-value 时,也就需要更新内存中的 HashMap 来记录刚刚写入数据的偏移量;当查找某个值时,使用 HashMap 来找到文件中的存储位置,然后读取其内容。

上面的方式虽然很简单,但是的确是一个可行的方法。静下来思考,多数实现其实都是换汤不换药,变化无非也就是通过计算 key 的 hash 值,然后映射对应的 value。

但是哈希索引使用起来,存在一定的问题(注意,这块面试的时候经常会聊呦!)。

  1. 哈希表必须全部放入内存,如果有大量的 key 的情况下,表现就不会那么好啦;
  2. 区间查询效率不太好,例如要查询 key0000 和 key9999 区间的所有键,只能采用逐个查找的方式查询每一个键(这是关键,因为我们平常使用数据库时经常会涉及、>>=<<=、 或 BETWEEN 运算符使用哈希索引就不可以满足到我们的需求的);
  3. 由于哈希索引数据没有按照索引值顺序存储,所以无法用来进行排序。
2.以红黑树作为索引

大家都知道红黑树本质上是一颗二叉排序树树,那么它就可以进行范围查询,并且查询速度也还可以为O(logN)但为什么我们不用红黑树呢,主要是以下几点原因:

  1. **范围查询效率高:**红黑树在范围查询时需要进行中序遍历,如果节点数量多(一般来说在真正的开发环境里,数据量至少都是百万基本的)效率极低。
  2. 磁盘I/O多:红黑树在每个节点都需要存储数据还是相同的节点数量多的话,占用空间较大,并且每次查询磁盘I/O多.
  3. **结构不稳定:**红黑树在插入和删除操作时会进行频繁的旋转和调整,这会导致索引的维护成本较高。对于索引来说,我们更希望能够快速地进行查找操作,而不需要频繁地调整树的结构.
3.b+树为什么适合作为索引

假设我们有这样一张表:

create table student(id int paimary key,
  name varchar(20),age int,gender varchar(2),height int....);

以id作为索引,b+树是这样,组织数据的:

关于B+如何插入数据,删除数据什么的这里博主就不过多的解释,只说明关于Mysql中的内容

1**.非叶子节点的值都会在其子节点上重复出现,这样做是为了,最后,叶子节点这一层就包含了整个数据集合**

2.非叶子节点只存id,占用的空间就比较小(这样就可以把非叶子节点缓存到内存中,当然这些数据也同时保存在硬盘上) 这样查询速度就加快了(减少磁盘I/O操作),而叶子节点储存的就不仅仅是id,还有name,age,gender等等数据,这样每次查询到最后都是最终要在叶子节点上完成,这样查询的磁盘I/O时间是基本相同,比较稳定

3.叶子节点最终是通过类似于链表的数据结构连接在一起,这样就遍历整张表的数据,以及进行范围比较,区间查询都是非常方便的

4.B+树是一种多路搜索树(减少了树的高度),能够快速定位到目标数据,因此非常适合作为索引结构

4.B+树相对于B树有以下不同之处

大家都知道还有一种树叫做B树也是多路搜索树,那为什么我们要用B+树作为索引呢,这里就不展示B树了,大家感兴趣的话可以自己查查百度

  1. 更大的磁盘空间利用率

    • B+树的内部节点(非叶子节点)不存储数据,仅存储索引,这使得单个节点能够容纳更多的键值,从而降低树的高度,特别是在大数据集下,B+树的整体高度通常小于相同阶数的B树,减少了磁盘I/O操作的数量。
  2. 更好的顺序访问效率

    • 所有数据都存储在叶子节点,并且叶子节点之间通过指针相连,形成一个有序链表。这样的设计使得进行范围查询或全表扫描时非常高效,只需遍历叶子节点链表即可,无需像B树那样深入多个层级或者跳转回父节点。
  3. 稳定的查询性能

    • 在B+树中,任何查询无论是否包含键值都需要查找到叶子节点,这意味着所有查询都有相同的路径长度,提供了更稳定的查询性能。
  4. 减少内存需求

    • B+树内部节点不存储实际数据,故内存缓冲区可以加载更多的内部节点,增加索引的覆盖范围,从而提高索引效率。

综上所述,B+树更适合于大量数据存储以及大型数据库系统,尤其是在需要频繁执行范围查询和顺序访问的场景中表现更为优秀。而B树虽然在某些情况下(比如数据离根节点近并且访问频繁时)可能有更快的随机查找速度,但在大规模数据管理和磁盘I/O优化方面,B+树具有明显优势。

1.4索引查询过程

这里先总结一些关于索引的知识,再说明索引查询过程

总结:

1.B+树存在的前提

B+树存在的前提是使用了InnoDB这个储存引擎,MySQL数据库提供了多种存储引擎,不同的存储引擎使用的索引的数据结构也是不同的,而InnoDB是最常用也是面试最常问的

2.B+树是一直存在的

如果你创定义了主键,那么就按照主键来创建,如果你没有定义主键,那么就会有自带的隐藏列来建立

3.有主键就一定有索引吗

在MySQL以及其他大多数关系型数据库系统中,如果定义了一个字段或一组字段为主键,那么数据库会自动为此主键创建一个索引。主键实际上是一种特殊的唯一索引,它不仅确保了数据的唯一性,还为数据库提供了高效的查询机制,因为它会自动被索引,使得通过主键值可以快速定位到相应的行记录。

索引查询过程:

假设我们有这样一张表

​
create table student(id int paimary key,
  name varchar(20),age int,gender varchar(2),height int....);

​

1.查询主键索引的过程

当执行查询如**select * from student where id = 1;** 时,MySQL首先会检查查询条件是否涉及到主键**id。如果是,它将直接在主键索引(通常为B+树)中查找id**为1的记录。主键索引的叶节点包含了完整的行数据(在InnoDB引擎中表现为聚簇索引,数据行跟索引在一起),因此找到索引后就能立即获取所需的所有列数据,无需额外的回表操作。

2.查询非主键非索引的过程:

当执行查询如**select * from student where age = 18;**由于数据库中并没有关于``**age****的索引,**MySQL必须进行全表扫描,逐行对比**age**的值,直到找到匹配项为止。这个过程对于大表来说效率较低,因为可能需要遍历整个表的数据.

3.查询非主键索引的过程

假设我们为name建立索引该字段是非主键但是已建立索引,当执行查询如 select id from student where name = “张三”;首先在name对应的非主键索引(二级索引)中定位到name = 的**"张三"索引记录,如果只是查询id索引覆盖的列,则可以直接从索引中取得数据,无需回表若查询包括不在索引中的其他列如select * from student where name = “张三”**,则需要通过索引记录中存储的主键值,再去主键索引中查询对应的完整行数据,这个过程称为“回表”

总结起来,主键索引查询最快,直接命中索引并获取数据;非主键索引查询能利用索引加速查询,但可能涉及回表;非索引字段查询最慢,一般需要全表扫描。

1.5索引的语法

create [unique | fulltext] index 索引名
on 表名 (列名1, 列名2, ...);

-- 或者对于唯一索引
create unique index index_name
on table_name (column1);

-- 或者对于全文索引(mysql 5.6及以上版本对innodb支持全文索引)
create fulltext index index_name




# 独家面经总结,超级精彩

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

![image](https://img-blog.csdnimg.cn/img_convert/0c9aa229f0650b6a4ce114815f469af2.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/db7bcebc31b2ab33fa94a3c07670ce12.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/a6525225c79765057f738a6071ff2c31.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/b4efcac4bb1cc467e4be13a46da2eb95.webp?x-oss-process=image/format,png)

# Java面试准备

准确的说这里又分为两部分:

1.  Java刷题
2.  算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

![image](https://img-blog.csdnimg.cn/img_convert/0570988ea18ea648d575821606001d41.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/9b320d8160157b73f856e5744c3c2eb3.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

说这里又分为两部分:

1.  Java刷题
2.  算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

[外链图片转存中...(img-E9JOLV9G-1715644841412)]

[外链图片转存中...(img-OgL9KUdQ-1715644841413)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值