mysql二进制恢复 主键 重复,【Mysql技术内幕InnoDB存储引擎】札记

1.体系结构及存储引擎

组成部分

连接池组件

管理服务和工具组件

SQL接口组件

查询分析器组件

haun缓存组件

插件式存储引擎

物理文件

连接mysql

TCP/IP

命名管道/共享内存

Unix域套接字

2.InnoDB存储引擎

体系架构

后台线程

1个master thread

主循环

每秒钟操作

日志缓冲刷新到磁盘,即使这个事务还没有提交(总是).

合并插入缓冲(可能)

至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)

如果没有用户活动,切换到background loop(可能)

每10秒钟操作

刷新100个脏页到磁盘(可能)

合并至多5个插入缓冲(总是)

将日志缓冲刷新到磁盘(总是)

删除无用的undo页(总是)

刷新100个或者10个脏页到磁盘(总是)

产生一个检查点(总是)

后台循环

删除无用的undo页(总是)

合并20个插入缓冲(总是)

跳回到主循环(总是)

不断刷新100个页,直到符合条件(可能,跳转到flush loop中完成)

刷新循环

暂停循环

4个IO thread

>insert buffer thread,

log thread,

read thread,

write thread

1个锁监控线程

1个错误监控线程

内存

缓冲池(buffer pool)

最大块内存,存放各种数据的缓存。innoDB将数据库文件按页(16k/页)读取到缓存池,然后按最近最少LRU算法保留在缓冲池中的缓存数据。如果数据库文件需要修改,首先修改再缓冲池中的页,(脏页),然后再按一定频率将脏页刷新到文件。

数据页类型:索引页,数据页,undo页,插入缓冲,自适应哈希索引,innoDB存储的锁信息,数据字典信息。

重做日志缓冲池(redo log buffer)

将重做日志信息先放入这个缓冲区,然后按一定频率刷新到重做日志文件。

额外内存池(additional memory pool)

插入缓存(insert buffer)

先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,否则,先放入一个插入缓冲区,再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作。

索引是辅助索引

索引不是唯一的

如果是唯一的,又会去查找索引页的情况,出现离散读。

两次写(double write)

144743334.png

自适应哈希索引

3.文件

日志文件

错误日志

慢查询日志

long_query_time 默认10秒

运行时间>long_query_time会被记录

查询日志

所有请求信息,不论是否正确执行

二进制日志

恢复

复制

套接字文件

pid文件

表结构定义文件 *.frm

innoDB存储引擎文件

表空间文件

重做日志文件

4.表

表空间

表空间>段(segment)>区(extent)>页(page)

144743335.png

数据段(B+树的页节点)

索引段(非页节点)

回滚段

64个连续页,每个页16k,每个区1M

16k

数据页

Undo页

系统页

事务数据页

插入缓冲位图页

插入缓冲空闲列表页

未压缩的二进制大对象页

压缩的二进制大对象页

每个页最多存放16k/2-200行 约等于7992行

innoDB行记录格式

compact行记录格式

如果一个页中存放的行数据越多,性能越高

redundant行记录格式

行溢出数据

实际varchar最大65532

Uncompressed BLOB Page

由于是B+树,每页至少应该有2个记录,当只能存放一条时,将行数据放到溢出页中

InnoDB数据页结构

144743336.png

4.7 约束

数据完整性

实体完整性

Primary key

Unique key

域完整性

Foreign key

Default

参照完整性

4.7.6 触发器

最多为一个表建立5个触发器,Insert,Update,Delete,Before,After

4.7.7 外键

4.8 视图

4.9 分区表

range分区

list分区

key分区

columns分区

5.索引与算法

InnoDB存储引擎索引

B+树

B+树插入操作

页节点满

索引节点满

操作

NO

NO

直接插入

Yes

No

拆分页节点,将中间的节点放入索引页中,小于中间节点的记录放左边,大于中间节点的放右边

Yes

No

查分页节点,小于中间节点的记录放左边,大于等于中间节点的记录放右边,拆分索引页,小于中间节点的放左边,大于中间节点放右边,中间节点放上一层索引页

B+树删除

Leaf Page Below Fill Factor

Index Page Below Fill Factor

操作

No

No

直接删除页节点,如果该节点还是index Page节点,用该节点的右节点代替dai

Yes

No

合并叶节点及其兄弟节点,同时更新index Page

Yes

No

合并叶节点及其兄弟节点,更新indexPage,合并Index Page及其兄弟节点

5.5.1 聚集索引

每张表只能有一个聚集索引,,按每张表的主键构造一颗B+树

5.5.2 辅助索引(非聚集索引)

叶节点包含一个书签,记录指向主键索引的指针,然后通过主键索引找到完整记录。

5.6.1 什么时候使用非聚集树索引

字段离散度大

获取行数少

如果行数覆盖多,会走全表扫描,原因:非聚集索引后还需要找聚集索引,这个过程随机读

5.6.2 顺序读,随机读,预读取

随机预读取

当一个区(64个连续页)中13个页也在缓冲区中,并在LRU列表前端,则将剩余的所有页预读到缓冲区

线性预读取

如果一个区中的24个页都被顺序的访问,则会读取下一个区的所有页。

5.6.3 辅助索引优化

5.6.4 联合索引

不能直接使用非第一个字段开始的索引

索引(a,b), b=xxxx不能使用

可以对第二个键值排序

order by b 可以减少一次排序

5.7 哈希算法

哈希表查询缓冲池中的页

6.锁

6.2 InnoDB中的锁

6.2.1 锁的类型

共享锁 SLock

排它锁 XLock

意向共享锁 ISLock

意向排它锁 IXLock

6.2.2 非锁定读操作

正在执行delete update操作的数据,会去读取行的一个快照数据

快照通过Undo段实现

MVCC 多版本并发控制

在RC,RR下对于快照的定义不同,RC下总是读取被锁定行的最新一份快照数据,RR下总是读取事务开始时的版本

6.3 锁的算法

Record Lock 单行锁

Gap Lock 间隔锁,锁定一个范围,但不包含记录本身

Next-Key Lock: Gap+Record 锁定一个范围,并且锁定记录本身。

6.4 锁问题

6.4.1 丢失更新

加排他锁 (select ** for update)

6.4.2 脏读

6.4.3 不可重复读

6.5 阻塞

6.6 死锁

6.7 锁升级

将当前锁的粒度降低,把一个表1000行锁升级为页锁,页锁升级为表锁

7.事务

A 原子性 atomicity

C 一致性 consistency

I 隔离性 isolation

D 持久性 durability

7.2 事务的实现

7.2.1 redo

先写日志,再写数据

重做日志

7.2.2 undo

undo段,位于共享表空间

master thread中回收undo页

7.3 事务控制语句

Start Transaction | begin

COMMIT

ROLLBACK

savepoint

release savepoint

rollback to

set transaction

7.4 隐式提交sql语句

DDL语句

隐式修改mysql架构的操作:create user,drop user,grant,rename user,revoke,set password

管理语句

7.6 事务隔离级别

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ 默认

SERIALIZABLE

SERIALIZABLE

对每个SELECT语句自动加上LOK IN SHARE MODE

8.备份与恢复

Hot backup

Cold backup

Warm backup

9.性能调优

OLTP

online Transaction Processing 在线事务处理 日常事物处理应用

OLAP

online Analytical Processing 在线分析处理 多用于数据仓库或数据集市

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值