​ 同⼀字段的多次读取结果都是⼀致的,除⾮数据是被本身事务⾃⼰所修改;

​ 可重复读是有可能出现幻读的,如果要保证绝对的安全只能把隔离级别设置成SERIALIZABLE;这样所有事务都只能顺序执行,自然不会因为并发有什么影响了,但是性能会下降许多。

​ 第二种方式,使用更新的版本控制。维护一个字段作为updateversion,修改时updateversion也作为一个参数传入,在条件语句中添加例如where id=? and update_version = ? 当然set里面要update_version+1。这样可以控制到每次只能有一个人更新一个版本。

4、RR和RC如何实现的?RR使用场景?

​ 事务隔离级别RC(read commit)和RR(repeatable read)两种事务隔离级别基于多版本并发控制MVCC(multi-version concurrency control)来实现。

​ 由于RC隔离级别需要保持语句级别的一致性,事务中每一次读取都是访问当前时间点的已提交数据,因此事务中多条查询语句会创建多个不同的ReadView,开销较大,复杂度更高;而对于RR隔离级别,仅需要一个版本的ReadView,消耗更少,因此Mysql默认使用RR隔离级别。

​ RC隔离级别获得的是语句级读一致性;RR隔离级别获得的是事务级读一致性

​ 对于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子句中出现>时,联合索引命中是如何的?

​ 最左前缀原则主要使用在联合索引中,联合索引的B+Tree是按照第一个关键字进行索引排列的。

​ 联合索引的底层是一颗B+树,那么联合索引的底层也就是一颗B+树,只不过联合索引的B+树节点中存储的是键值。由于构建一棵B+树只能根据一个值来确定索引关系,所以数据库依赖联合索引最左的字段来构建。

​ 采用>、<等进行匹配都会导致后面的列无法走索引,因为通过以上方式匹配到的数据是不可知的。

17、MySQL中一条SQL语句的执行过程

白嫖资料

查询语句:


select * from student  A where A.age='18' and A.name='张三'; 

结合上面的说明,我们分析下这个语句的执行流程:

  • 先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在mysql8.0版本以前,会先查询缓存,以这条sql语句为key在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。

  • 通过分析器进行词法分析,提取sql语句的关键元素,比如提取上面这个语句是查询select,提取需要查询的表名为tb_student,需要查询所有的列,查询条件是这个表的id=‘1’。然后判断这个sql语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。

  • 接下来就是优化器进行确定执行方案,上面的sql语句,可以有两种执行方案: a.先查询学生表中姓名为“张三”的学生,然后判断是否年龄是18。 b.先找出学生中年龄18岁的学生,然后再查询姓名为“张三”的学生。 那么优化器根据自己的优化算法进行选择执行效率最好的一个方案(优化器认为,有时候不一定最好)。那么确认了执行计划后就准备开始执行了。

  • 进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来,需要的话点击这里免费获取

目录:

部分内容截图:

没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来,需要的话点击这里免费获取

目录:

[外链图片转存中…(img-KSE6G5Za-1628432225177)]

部分内容截图:

[外链图片转存中…(img-TOFKiPRd-1628432225180)]

[外链图片转存中…(img-Z6AW7Qh7-1628432225182)]

不是吧阿sir(1),史上最全相关推荐

  1. 这可能是史上最全的Python算法集!

    来源 | CSDN(ID:CSDNnews ) 本文是一些机器人算法(特别是自动导航算法)的Python代码合集. 其主要特点有以下三点:选择了在实践中广泛应用的算法:依赖最少:容易阅读,容易理解每个 ...

  2. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  3. 史上最全 Java 多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

  4. .Net魔法堂:史上最全的ActiveX开发教程——发布篇

    一. 前言 接着上一篇<.Net魔法堂:史上最全的ActiveX开发教程--开发篇>,本篇讲述如何发布我们的ActiveX. 二.废话少讲,马上看步骤! 1. 打包  C#开发的Activ ...

  5. 史上最全《知识图谱》2020综述论文!!!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 知识图谱是当下的研究热点.最近18位学者共同撰写了一篇<知识图谱>综述 ...

  6. 【干货】史上最全的Tensorflow学习资源汇总,速藏!

    一 .Tensorflow教程资源: 1)适合初学者的Tensorflow教程和代码示例:(https://github.com/aymericdamien/TensorFlow-Examples)该 ...

  7. 吐血总结|史上最全的MySQL学习资料!!

    在日常工作与学习中,无论是开发.运维.还是测试,对于数据库的学习是不可避免的,同时也是日常工作的必备技术之一.在互联网公司,开源产品线比较多,互联网企业所用的数据库占比较重的还是MySQL. 在刚刚出 ...

  8. “史上最全PyTorch资源汇总“(转载)

    转载自"史上最全PyTorch资源汇总":教程.实战.必读论文.中文教材一应俱全 项目地址: https://github.com/INTERMT/Awesome-PyTorch- ...

  9. 史上最全异常检测算法概述

    史上最全异常检测算法概述 参考文章: (1)史上最全异常检测算法概述 (2)https://www.cnblogs.com/Bang-cansee/p/4954129.html 备忘一下.

  10. python优化算法工具包_这可能是史上最全的 Python 算法集(建议收藏)

    原标题:这可能是史上最全的 Python 算法集(建议收藏) 导读:本文是一些机器人算法(特别是自动导航算法)的Python代码合集.其主要特点有以下三点: 选择了在实践中广泛应用的算法: 依赖最少: ...

最新文章

  1. Atitit.提升 升级类库框架后的api代码兼容性设计指南
  2. Spring Cloud Config 加密和解密
  3. 导入技能要素三大类_教学技能之导入技能(值得收藏)
  4. mysql aes_MYSQL AES加密与解密函数使用
  5. 你家猫砸东西是不是也专挑贵的砸?
  6. Ubuntu16.04安装Hadoop+Spark+pyspark大数据python开发环境
  7. phpstudy本地搭建域名访问
  8. visual studio 删除附加项
  9. php手册 下载,php手册chm
  10. ShuffleNet v2
  11. 学习Coverity codexm的一些资料
  12. 霹雳吧啦Wz语义分割学习笔记P1
  13. 分布式服务协调---幂等(Idempotent)机制
  14. 炸了!3年图片都没了!
  15. Git 每次提交都需要输入密码
  16. Houdini 中DOP CHOP SHOP SOP VOP是什么?
  17. 51GIS学院|分享大数据项目架构思考(一)
  18. win7计算机虚拟内存,Win7系统怎样关闭虚拟内存?win7关闭虚拟内存的方法
  19. JavaScript自学基础
  20. 半导体物理-Threshold Voltage Model for FinFET

热门文章

  1. php mysql天龙八部_php天龙八部
  2. 图的连通性相关总结:强连通,双连通,割点割边,2-sat
  3. 从工地转行网络安全工程师,工资翻了好几倍,我想和大家聊聊我的经历
  4. dell笔记本计算机打不开,戴尔笔记本电脑开不了机如何解决【解决方法】
  5. matplotlib在一张图同时画折线图和柱状图
  6. 重磅:天猫积分将关闭抵现功能啦 !
  7. Cocos精品|《三打白骨精》带你感受指尖封神
  8. 世界上最健康的工程师作息表!
  9. python秒转化为分钟-python时间时分秒与秒数的互相转换
  10. 号称年薪30万占比最多的专业,你知道是啥嘛?