知道了索引的设计,我们能够知道另外一些信息:

  1. MySql 的主键不能太大,如果使用 UUID 这种,将会浪费 B+ 树的非叶子节点。

  2. MySql 的主键最好是自增的,如果使用 UUID 这种,每次插入都会调整 B+树,从而导致页分裂,严重影响性能。

那么,如果项目中使用了分库分表,我们通常都会需要一个主键进行 sharding,那怎么办呢?在实现上,我们可以保留自增主键,而逻辑主键用来作为唯一索引即可。

[](

)[](

)2. 锁机制

关于 Mysql 的锁,各种概念就会喷涌而出,事实上,锁有好几种维度,我们来解释一下。

[](

)[](

)1. 类型维度

  • 共享锁(读锁 / S 锁)

  • 排它锁(写锁 / X 锁)

类型细分:

  • 意向共享锁

  • 意向排他(互斥)锁

  • 悲观锁(使用锁,即 for update)

  • 乐观锁(使用版本号字段,类似 CAS 机制,即用户自己控制。缺点:并发很高的时候,多了很多无用的重试)

[](

)[](

)2. 锁的粒度(粒度维度)

  • 表锁

  • 页锁(Mysql BerkeleyDB 引擎)

  • 行锁(InnoDB)

[](

)[](

)3. 锁的算法(算法维度)

  • Record Lock(单行记录)

  • Gap Lock(间隙锁,锁定一个范围,但不包含锁定记录)

  • Next-Key Lock(Record Lock + Gap Lock,锁定一个范围,并且锁定记录本身, MySql 防止幻读,就是使用此锁实现)

[](

)[](

)4. 默认的读操作,上锁吗?

  • 默认是 MVCC 机制(“一致性非锁定读”)保证 RR 级别的隔离正确性,是不上锁的。

可以选择手动上锁:select xxxx for update (排他锁); select xxxx lock in share mode(共享锁),称之为“一致性锁定读”。

使用锁之后,就能在 RR 级别下,避免幻读。当然,默认的 MVCC 读,也能避免幻读。

既然 RR 能够防止幻读,那么,SERIALIZABLE 有啥用呢?

防止丢失更新。例如下图:

这个时候,我们必须使用 SERIALIZABLE 级别进行串行读取。

最后,行锁的实现原理就是锁住聚集索引,如果你查询的时候,没有正确地击中索引,MySql 优化器将会抛弃行锁,使用表锁。

[](

)[](

)3. 事务

事务是数据库永恒不变的话题, ACID:原子性,一致性,隔离性,持久性。

四个特性,最重要的就是一致性。而一致性由原子性,隔离性,持久性来保证。

  • 原子性由 Undo log 保证。Undo Log 会保存每次变更之前的记录,从而在发生错误时进行回滚。

  • 隔离性由 MVCC 和 Lock 保证。这个后面说。

  • 持久性由 Redo Log 保证。每次真正修改数据之前,都会将记录写到 Redo Log 中,只有 Redo Log 写入成功,才会真正的写入到 B+ 树中,如果提交之前断电,就可以通过 Redo Log 恢复记录。

然后再说隔离性。

隔离级别:

  1. 未提交读(RU)

  2. 已提交读(RC)

  3. 可重复读(RR)

  4. 串行化(serializable)

每个级别都会解决不同的问题,通常是3 个问题:脏读,不可重复读,幻读。一张经典的图:

这里有个注意点,关于幻读,在数据库规范里,RR 级别会导致幻读,但是,由于 Mysql 的优化,MySql 的 RR 级别不会导致幻读:在使用默认的 select 时,MySql 使用 MVCC 机制保证不会幻读;你也可以使用锁,在使用锁时,例如 for update(X 锁),lock in share mode(S 锁),MySql 会使用 Next-Key Lock 来保证不会发生幻读。前者称为快照读,后者称为当前读。

原理剖析:

  • RU 发生脏读的原因:RU 原理是对每个更新语句的行记录进行加锁,而不是对整个事务进行加锁,所以会发生脏读。而 RC 和 RR 会对整个事务加锁。

  • RC 不能重复读的原因:RC 每次执行 SQL 语句都会生成一个新的 Read View,每次读到的都是不同的。而 RR 的事务从始至终都是使用同一个 Read View。

  • RR 不会发生幻读的原因: 上面说过了。

那 RR 和 Serializble 有什么区别呢?答:丢失更新。本文关于锁的部分已经提到。

MVCC 介绍:全称多版本并发控制。

innoDB 每个聚集索引都有 4 个隐藏字段,分别是主键(RowID),最近更改的

【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】浏览器打开:qq.cn.hn/FTf 免费领取

事务 ID(MVCC 核心),Undo Log 的指针(隔离核心),索引删除标记(当删除时,不会立即删除,而是打标记,然后异步删除);

Java必备——MySql 三大知识点相关推荐

  1. 新人学习Python的必备11个知识点,要记得收藏

    Python被誉为全世界高效的编程语言,同时也被称作是"胶水语言",那它为何能如此受欢迎,下面我们广州千锋就来说说Python入门学习的必备11个知识点,也就是它为何能够如此受欢迎 ...

  2. Java面试10大知识点总结宝典助你通关!已拿意向书!

    Java基础 1.Java语言的三大特性 2.Java语言主要特性 3. JDK和JRE有什么区别 4.Java基本数据类型及其封装类 5.如果main方法被声明为private会怎样? 6.说明- ...

  3. mysql insert表名前不写字段_云计算教程分享Mysql技术知识点

    云计算教程分享Mysql技术知识点,首先来讲一下Mysql语句精进 安装数据库,然后导入tigerfive.sql. sql见文档结尾部分 MySQL示例数据库模式由以下表组成: - customer ...

  4. 【总结】Java核心技术36讲知识点大纲(转载)

    Java核心技术36讲知识点总结大纲 1 Java平台的理解 Java的特性,解释运行和编译运行 2 Exception 和 Error 有什么区别 理解Java的异常体系的设计,Throwable ...

  5. 【总结】Java核心技术36讲知识点大纲

    前段时间在极客时间上购买了杨晓峰老师的<Java核心技术36讲>,趁着这段时间有空,对相关知识点做了一个整体的大纲,也对自己所掌握的Java基础进行了一个复习和梳理,若想深入学习,可以购买 ...

  6. 网络报修信息管理代码java_javaweb在线报修维修系统、java+ssh+mysql实现

    需求分析 基于SSH技术(struts2,spring,hibernate)实现一个在线报修维修系统, 支持管理员, 维修人员, 普通用户这些角色, 每个角色动态具有相应的功能权限, 能够进行维修人员 ...

  7. 汽车维修管理系统汽车维修管理系统采用B / S架构,主要使用Java技术进行开发,结合最新流行的java和mysql的SSM框架技术。

    摘 要 21世纪是一个知识大爆炸的时代,互联网拉近了人们的距离,信息化革命席卷了各个行业.物质生活水平的提高使得人们的消费观念悄然发生改变,人们对汽车维修管理系统的要求越来越高,这对于传统汽车维修管理 ...

  8. MySQL重要知识点

    可能是全网最好的MySQL重要知识点 | mp.weixin.qq.com 点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 标题有点标题党的 ...

  9. Java开发的三大框架有哪些?

    Java编程这么些年来不仅平稳的发展,而且也渐渐成为众多企业首选的编程语言.Java框架是程序员们必学的知识点,而且是十分重要的应用,Spring.Struts.Hibernate也是经典中的经典,最 ...

最新文章

  1. 第四章 python的turtle库的运用
  2. 多语言互通:谷歌发布实体检索模型,涵盖超百种语言和千万个实体
  3. SVG.use/拖拽
  4. Accusoft结构化工具包FormSuite for Structured Forms常见问题解答(二)
  5. 微信小程序正则判断姓名和手机号
  6. django项目时间与Ubuntu时间不一致
  7. 7-6 顺序存储的二叉树的最近的公共祖先问题 (10 分)
  8. 乐高科技系列搭建指南 pdf_玩转乐高创意亲子搭建系列(4)小颗粒作品
  9. Centos7安装完毕后无法联网的解决方法
  10. 查找元器件_电子元器件-常用电子元器件基础知识大全
  11. 如何在Mac上使用听写进行语音到文本的键入
  12. ENVI入门系列教程---一、数据预处理---5. 图像自动配准
  13. Kafka中Producer与Broker之间的交互
  14. 细节至上——Splus微博设计之界面篇(转)
  15. 2022年聚合工艺特种作业证考试题库及在线模拟考试
  16. 台式电脑投影切屏快捷键_电脑投影切屏快捷键
  17. java将pdf旋转(亲测有效)
  18. 北京35岁程序员失业,感叹:还是去卖煎饼果子吧~
  19. gcat广告电商云南百收涉及传销新模式:社交电商消费返利
  20. Android WebRTC 入门教程(一) -- 使用相机

热门文章

  1. (41)Xilinx MMCM IP核配置(二)(第9天)
  2. (14)VHDL测试激励编写(时钟)
  3. (81)Verilog HDL:状态机一段式
  4. 一文看懂压敏电阻和tvs的区别
  5. 有源蜂鸣器的驱动设计
  6. 深入探讨一下如何打断点
  7. 初始化跟路由相关的定时器
  8. 从程序员到项目经理(三)
  9. C语言的那些秘密之---函数返回局部变量(转)
  10. Java\学习——字符串