接连面试几家公司,都被刷了下来,总结自己,

  1. mysql了解的太少了,
  2. 算法不行,
  3. 脑子不够用.逻辑思维不好...........
  4. 人事问题达到不好,情商不够.

所以刷这本书,把mysql看看.

生活加油!依旧,摘一句子:平生不会相似,才会相思,便害相思. 2019.10.19

书的PDF资源在最后

第一章,MySQL体系结构和存储引擎

Mysql被设计为一个单进程多线程架构的数据库,Mysql数据库实例在系统上的表现就是一个进程.

mysql体系结构:连接池组件,管理服务和工具组件,SQL接口组件,查询分析器组件,优化器组件,缓存组件,插件式存储引擎.存储引擎.

存储引擎是基于表的,而不是数据库.

  1. InnoDB存储引擎 ,InnoDB存储引擎支持事务,其设计目标主要是面向在线事务处理(OLTP)的应用.
  1. 特点:行锁设计,支持外键,5.5.8开始为默认存储引擎.
  2. InnoDB通过使用多版本并发控制(MVCC)来获得高并发性.
  3. 对于表中数据的存储,InnoDB采用了聚集的方式,因此每张表的存储都是按主键的顺序进行存储的.没有主键,会生成一个6个字节的ROWID,作为主键.
  1. MyISAM存储引擎 ,不支持事务,表锁设计,支持全文索引
  1. MyISAM存储引擎的缓存池只缓存索引文件,不缓存数据文件,
  1. NDB存储引擎 ,集群存储引擎,数据全部放在内存中,因此主键查找速度极快.连接操作是在mysql数据库层完成的.
  2. Memory存储引擎 ,表中的数据存储在内存中,如果数据库重启或发生崩溃,表中的数据消失,适合存储临时数据的临时表.
  1. 支持表锁.并发性差,不支持文本和二进制,默认使用哈希索引.
  1. Archive存储引擎只支持INERT和SELECT操作.
  2. Federated存储引擎 :不存放数据,它只是指向一台远程Mysql数据库服务器上的表.
  3. Maria存储引擎 ,支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,

第二章,InnoDB存储引擎

InnoDB是事务安全的支持ACID的存储引擎,

特点:行锁设计,支持MVCC(多版本并发控制),支持外键,提供一致性的非锁定读.

《MySQL技术内幕InnoDB存储引擎》学习笔记_数据

MVCC的实现,通过保存数据在某个时间点的快照来实现的。这意味着一个事务无论运行多长时间,在同一个事务里能够看到数据一致的视图。根据事务开始的时间不同,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。实现了读的非阻塞.

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

后台线程,InnoDB存储引擎是多线程的模型,后台有多个不同的后台线程,,处理不同的任务.

  1. Master Thread:核心的后台线程,主要负责将缓存池中的数据异步刷新到磁盘,

第三章,文件

第四章,表

第五章,索引和算法

InnoDB存储引擎支持以下几种常见的索引:

  1. B+树索引
  2. 全文索引
  3. 哈希索引

InnoDB存储引擎支持的哈希索引是自适应的,InnoDB存储引擎会根据表的使用自动生成哈希索引,不能人为的干预,

B+树索引类似于二叉树,根据键值对快速找到数据.B+树能找到的只是被查找数据行所在的页,数据库读取该页到内存,在再内存中查找,最后得到数据.

二分法查找-->二叉查找树-->平衡二叉树(任何节点的连个子树的高度最大差为1)-->B+树

《MySQL技术内幕InnoDB存储引擎》学习笔记_存储引擎_02

B+树:

树是为磁盘或其他的直接存取辅助设备设计的一种平衡查找树,在B树中,所有的记录节点都是按键值的大小顺序存放在同一层的叶子节点上.由各叶子节点指针进行连接,

《MySQL技术内幕InnoDB存储引擎》学习笔记_子节点_03

高度为2,每页可以存放4条记录,扇出为5,

B+树的插入操作:

必须保证插入后的叶子节点中记录依然有序,同时需要考虑插入到B+树的三种情况,对应Leaf Page(叶子页)和index Page(索引页)的不同操作.
 

B+树的插入方式

Leaf Pagr(叶子页)

index Page(索引页)

操作

NO

NO

直接将记录插入

Yes

NO

  1. 拆分Leaf Page
  2. 将中间的节点放入到Index Page 中
  3. 小于中间节点的记录放在左边
  4. 大于或等于中间节点的记录放在右边

Yes

Yes

  1. 拆分Leaf Page
  2. 小于中间节点的记录放到左边,
  3. 大于或等于中间节点的记录放到右边.
  4. 拆分Index Page
  5. 小于中间节点的记录放在左边
  6. 大于中间节点的记录放到右边
  7. 中间节点放入上一层Index Page

第一种:

《MySQL技术内幕InnoDB存储引擎》学习笔记_子节点_04

第二种:

《MySQL技术内幕InnoDB存储引擎》学习笔记_数据_05

第三种

《MySQL技术内幕InnoDB存储引擎》学习笔记_子节点_06

B+树的旋转发生在Leaf Page 已经满,但是其左右兄弟节点没有满,在通常情况下,左兄弟会被首先检查用来做旋转操作,插入70,B+树并不急于拆分叶子节点,而是做旋转操作.

《MySQL技术内幕InnoDB存储引擎》学习笔记_数据_07

B+树的删除操作

B+树使用填充因子来控制树的变化,50%是填充因子可设的最小值,B+树的删除操作同样保证删除后的叶子节点中的记录依然排序.同插入一样,
 

B+树的删除操作

叶子节点小于填充因子

中间节点小于填充因子

操作

NO

NO

直接将记录从叶子节点删除,如果该节点还是IndexPage的节点,用该节点的右节点代替

Yes

No

合并叶子节点和它的兄弟节点,同时更新Index Page

Yes

Yes

  1. 合并叶子节点和它的兄弟节点
  2. 更新Index page
  3. 合并Index Page 和它的兄弟节点

第一种:

《MySQL技术内幕InnoDB存储引擎》学习笔记_数据_08

《MySQL技术内幕InnoDB存储引擎》学习笔记_数据_09

第二种:


第三种:

《MySQL技术内幕InnoDB存储引擎》学习笔记_存储引擎_10

B+树索引

B+树索引的本质就是B树种数据库中的实现.B+索引中数据库中的一个特点是高扇出性.因此在数据库中,B+树的高度一般为2~4层,这也就是说找某一键值的行记录时最多只需要2~4次,

数据库中的B+树索引可以分为聚集索引和辅助索引,内部都是B+树索引 . 聚集索引和辅助索引不同的是,叶子节点存放的是否是一个整行的信息.

聚集索引

由于实际的数据页只能按照一颗B+树进行排序,因此每张表只能拥有一个聚集索引.

聚集索引的存储并不是物理上连续的,而是逻辑上连续的,前面说的页面通过双向链表连接,也按照主键的顺序排序,另一个没个页中的记录也是通过双向链表进行维护的.

聚集索引的另一个好处是,

  1. 它对于主键的排序查找和范围查找速度非常快,
  2. 叶子节点就是用户所要查询的数据,
  3. 由于B+树索引是双向链表,用户可以快速到最后一个数据页.

辅助索引:也称非聚集索引,叶子节点并不包含行记录的全部数据,叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含一个书签,该书签用来告诉InnoDB存储引擎那里可以找到与索引相对应的行数据.

InnoDB存储引擎是表组织索引表,因此InnoDb存储引擎的辅助索引的书签就是相应行数据的聚集索引键.

《MySQL技术内幕InnoDB存储引擎》学习笔记_数据_11

 虽然每张表只可以有一个聚合索引,每张表可以有多个辅助索引.通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助并通过叶级别的指针获得指向主键索引的主键.然后再通过主键索引来找到一个完整的行记录.

如果在一颗高度为3的辅助索引树中查找数据,那需要对这颗辅助树遍历三次找到主键,如果聚集索引树的高度为3,那么还需要对聚集索引树进行三次查找.最终找到一个完整的行数所在的页,因此,一共需要六次逻辑IO访问以得到最终的数据页.

B+树索引的分裂

B+树索引页的分裂并不总是从页的中间,InnoDB存储引擎的page Header中有以下几个部分用来保存插入的顺序信息.

  1. PAGE_LAST_INSERT
  2. PAGE_DIRECTION
  3. PAGE_N_DIRECTION

通过这些信息,InnoDB存储引擎可以决定是向左还是向右进行分裂.同时决定将分裂记录记录为那一个.
若是插入记录是随机的,则取中间记录作为分裂点,

若是往同一个方向插入的记录数为5,并且已经定位到记录之后还有三条记录,则分裂点的记录为定位到的记录后的第三条记录.否者分裂点的记录为待插入的记录.

B+树索引的管理

1,索引的管理

索引的创建和删除可以通过两种方法,

  • 1,ALERT TABLE :
  • CREATE/DROP  INDEX
     

第六章,锁

一.什么是锁

锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问.

InnoDB存储引擎会在行级别上对表数据上锁,数据库系统使用锁是为了支持对共享资源进行并发访问.提供数据的完整性和一致性.

  • InnoDB存储引擎锁的实现提供了一致性的非锁定读,行级锁支持,行级锁没有相关的额外的开销,并可以同时得到并发性和一致性.

MyISAM引擎,其锁是表锁设计,并发情况下读没有问题.但是并发插入时性能就会差一些.

二,lock与latch

latch一般称为闩(shuan)锁,要求锁定的时间必须非常的短,若持续时间长,应用的性能会下降,

  • 在InnoDB存储引擎中,Latch有可分为mutex(互斥锁)和rwlock(读写锁),其目的用来保证并发线程操作临界资源的正确性.并且没有死锁检测的机制.

lock的对象是事务,用来锁定的数据库中的对象,如表页行,并且lock的对象仅在事务commit或则rollback后进行释放,不同的事务隔离级别可能不同,有死锁机制.

《MySQL技术内幕InnoDB存储引擎》学习笔记_子节点_12

三,InnoDB存储引擎中锁

InnoDB存储引擎提供了两种标准的锁的类型:

  1. 共享锁(S Lock):允许事务读一行数据,
  2. 排他锁(X Lock):允许事务删除或更新一行数据.

图片::::

锁兼容(Lock Compatible):如果一个事务T1已经获得行R的共享锁,那么另外的事务T2可以获得行r的共享锁.因为读取并没有改变行R的数据,称这种情况为锁兼容.

锁不兼容:当其他的事务T3想要获得行r的排他锁的时候,则必须等待事务T1,T2释放行r上的共享锁.

排他锁和共享锁的兼容性

 

X

S

X

不兼容

不兼容

S

不兼容

兼容

排他锁和任意锁都不兼容,共享锁仅和共享锁兼容,共享锁和排他锁都是行锁,兼容是指同一记录锁的兼容性情况.

InnoDB存储引擎支持多粒度的锁定,即允许事务在行级别上的锁和表级别上的锁同时存在,

意向锁:为了支持在不同粒度上进行加锁操作,InnoDB存储引擎支持一种额外的锁方式,称之为意向锁.意向锁将锁定的对象分为多分层次,意向锁意味着事务希望在更细的粒度上加锁,

InnoDB存储引擎支持意向锁设计比较简练,意向锁即为表级别的锁,设计目的主要是为了在一个事务中揭示下一行将被请求的锁类型.支持两种意向锁.

  • 意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁.
  • 意向排他锁(IX Lock),事务想要获得一张表中某几行的排他锁.

《MySQL技术内幕InnoDB存储引擎》学习笔记_数据_13

 

第七章,事务

第八章,备份与恢复

第九章,性能调优

 

 

 

 

链接:https://pan.baidu.com/s/1cAciCI9FrzrsP6oY2xmI5Q&shfl=sharepset 
提取码:i6l3