不是吧阿sir,你这Mysql也太熟了吧,震惊面试官第五年,我三年开发经验,从字节跳动抖音离职后

本文详细解释了SQL的不同隔离级别、InnoDB和MyISAM存储引擎的特点、InnoDB的行级和表级锁机制,介绍了MVCC的工作原理以及哈希索引和B+树的优势。还讨论了如何避免全表扫描和使用Explain语句分析查询性能。
摘要由CSDN通过智能技术生成

​ 对于RC隔离级别,访问的数据是每次语句执行时间点的数据,而对于RR隔离级别,访问的数据是事务中第一条语句执行时间点的数据。

白嫖资料

5、隔离级别的单位是数据表还是数据行?如串行化级别,两个事务访问不同的数据行,能并发?

​ 读未提交:不加锁

​ 读已提交:加行锁,只锁要修改的行

​ 可重复读:加行锁,锁定的是查询的行

​ 可串行化:加表锁,在读取的每张表上加锁

​ 串行化级别:读不同的行,可以并发

6、存储引擎Innodb和Myisam的区别以及使用场景

Myisam: 支持表锁,适合读密集的场景,不支持外键,不支持事务,索引与数据在不同的文件

Innodb: 支持行、表锁,默认为行锁,适合并发场景,支持外键,支持事务,索引与数据同一文件

7、 介绍Inodb锁机制,行锁,表锁,意向锁

InnoDB⽀持⾏级锁(row-level locking)和表级锁,默认为⾏级锁

InnoDB按照不同的分类的锁:

共享/排它锁(Shared and Exclusive Locks):行级别锁,

意向锁(Intention Locks),表级别锁

间隙锁(Gap Locks),锁定一个区间

记录锁(Record Locks),锁定一个行记录

表级锁:

​ Mysql中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单 ,资源消耗也比较少,加锁快,不会出现死锁 。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。

行级锁:

​ Mysql中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。 InnoDB支持的行级锁,包括如下几种:

​ 记录锁(Record Lock): 对索引项加锁,锁定符合条件的行。其他事务不能修改和删除加锁项;

​ 间隙锁(Gap Lock): 对索引项之间的“间隙”加锁,锁定记录的范围(对第一条记录前的间隙或最后一条将记录后的间隙加锁),不包含索引项本身。其他事务不能在锁范围内插入数据,这样就防止了别的事务新增幻影行。

​ Next-key Lock: 锁定索引项本身和索引范围。即Record Lock和Gap Lock的结合。可解决幻读问题。

意向锁:

​ 当一个事务在需要获取资源的锁定时,如果该资源已经被排他锁占用,则数据库会自动给该事务申请一个该表的意向锁。如果自己需要一个共享锁定,就申请一个意向共享锁。如果需要的是某行(或者某些行)的排他锁定,则申请一个意向排他锁。

8、介绍MVCC.

​ MVCC是一种多版本并发控制机制,在大多数情况下代替行级锁,使用MVCC,能降低其系统开销.

​ MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制.

​ InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.

​ InnoDB只会查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的.

​ 1.MVCC手段只适用于Msyql隔离级别中的读已提交(Read committed)和可重复读(Repeatable Read).

​ 2.Read uncimmitted由于存在脏读,即能读到未提交事务的数据行,所以不适用MVCC.

​ 原因是MVCC的创建版本和删除版本只要在事务提交后才会产生。客观上,我们认为他就是乐观锁的一整实现方式,就是每行都有版本号,保存时根据版本号决定是否成功。

9、哈希索引是如何实现的?

​ 哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能

10、数据库索引为什么使用B+树,相对于B树有什么优点?为什么不能红黑树?

因为:

​ B+树的磁盘读写代价低,更少的查询次数,查询效率更加稳定,有利于对数据库的扫描

​ 相对B树,B+树是B树的升级版,只是把非叶子节点冗余一下,这么做的好处是为了提高范围查找的效率,解决数据库遍历效率低下问题;B+树只有叶节点存放数据,其余节点用来索引,而B树是每个索引节点都会有Data域。

​ 在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树与B+树可以有多个子女,从几十到上千,可以降低树的高度。

​ 磁盘预读原理:将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

11、聚簇索引和非聚簇索引区别

聚簇索引: 将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据

非聚簇索引: 将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置

​ 聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

12、回表查询和覆盖索引

白嫖资料

普通索引 需要扫描两遍索引树

(1)先通过普通索引定位到主键值id=5;

(2)在通过聚集索引定位到行记录;

这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

覆盖索引:如果where条件的列和返回的数据在一个索引中,那么不需要回查表,那么就叫覆盖索引。

实现覆盖索引:常见的方法是,将被查询的字段,建立到联合索引里去。

13、如何创建索引?

CREATE TABLE 表名( 字段名 数据类型 [完整性约束条件],

……, [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名](字段名1 [(长度)] [ASC | DESC]) [USING 索引方法] );

说明: UNIQUE:可选。表示索引为唯一性索引。 FULLTEXT:可选。表示索引为全文索引。 SPATIAL:可选。表示索引为空间索引。

INDEX和KEY:用于指定字段为索引,两者选择其中之一就可以了,作用是一样的。 索引名:可选。给创建的索引取一个新名称。

字段名1:指定索引对应的字段的名称,该字段必须是前面定义好的字段。 长度:可选。指索引的长度,必须是字符串类型才可以使用。

ASC:可选。表示升序排列。 DESC:可选。表示降序排列。 注:索引方法默认使用B+TREE。

ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名]

(字段名1 [(长度)] [ASC | DESC]) [USING 索引方法];

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名 ON 表名(字段名) [USING

索引方法];

14、如何避免全表扫描?

1.对查询进行优化,应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中对字段进行 null 值判断

3.应尽量避免在 where 子句中使用!=或<>操作符

4.in 和 not in 要慎用

否则将导致引擎放弃使用索引而进行全表扫描

15、Explain语句各字段的意义

mysql> explain select * from staff;

±—±------------±------±-----±--------------±-----±--------±-----±-----±------+ | id | select_type | table | type | possible_keys | key | key_len |

ref | rows | Extra |

±—±------------±------±-----±--------------±-----±--------±-----±-----±------+ | 1 | SIMPLE | staff | ALL | NULL | NULL | NULL |

NULL | 2 | NULL |

±—±------------±------±-----±--------------±-----±--------±-----±-----±------+ 1 row in set

| 列 | 含义 |

| — | — |

| id | 查询序号,序号越大越先执行,一样则按顺序执行 |

| select_type | 查询类型,SIMPLE、PRIMARY、UNION、SUBQUERY等 |

| table | 表名 |

| type | join类型,const,eq_ref,ref等 |

| possible_keys | join类型 |

| key | 实际选择的索引 |

| ken_len | 索引的长度 |

| ref | 与索引作比较的列 |

| rows | 要检索的行数 |

| Extra | 额外信息 |

16、最左前缀!!联合索引B+树是如何建立的?是如何查询的?当where子句中出现>时,联合索引命中是如何的?

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

读者福利

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

更多笔记分享

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

存中…(img-VPYJUfnA-1711166189480)]
[外链图片转存中…(img-tXcQsxOu-1711166189481)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-b5jx2yTV-1711166189481)]

读者福利

[外链图片转存中…(img-hzcF0JyK-1711166189482)]

更多笔记分享

[外链图片转存中…(img-PFPdfl2N-1711166189482)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值