赞
踩
MySQL体系结构主要分为两层,MySQL server层和存储引擎层,而在server层包括连接层和sql层。
应用程序通过接口来连接MySQL,最先连接处理的是连接层,连接层包括通信协议,线程处理,用户密码认证三个部分。
SQL层包括权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划。
在MySQL中,存储引擎是最重要的一点,也是MySQL区分于其他数据库最核心一点
MySQL数据库极其分支版本主要的存储引擎有innoDB、MyISAM、Memory2、blackhole、TokuDB和MariaDB columnstore。
存储引擎名称 | 特点 | 应用场景 |
---|---|---|
InnoDB | 支持事务、行锁,支持MVCC 多版本并发控制,并发性高 | 应用于OLTP3业务系统 |
MyISAM | 不支持事务,表锁,MySQL8.0之后被废弃了,并发性很低,资源利用率也很低 | 应用于OLAP4业务系统,建议在生产环境中尽量少用 |
Memory | 表中的数据都在内存中存放,不落地,支持HASH索引和Btree索引,数据安全性不高,读取速度快 | 应用于对数据安全性不高的环境下 |
TOkuDB | 归Percona公司所有。支持事务,支持压缩功能、高速写入功能(比InnoDB快9倍),在线 online DDL,不产生索引碎片 | 应用海量数据存储的情况下 |
MariaDB columnstore | 列式存储引擎,高压缩功能 | 数据仓库,OLAP业务系统 |
Blackhole | 并不写数据,写数据时只写binlog | Blackhole 常用来做binlog转储或者测试 |
InnoDB体系结构5实际上由内存结构、线程、磁盘文件三部分组成。
page 是innoDB磁盘I/O的最小单位,数据是存放在page中的,那么对应到内存中就是一个一个的buffer,每个buffer又分为三种状态。
buffer在内存中是需要被组织起来的,由chain管理,也就是链。InnoDB是双向链表结构,由三种不同的buffer状态衍生出三条链表。
InnoDB存储引擎属于多线程模型,后台有多种线程,负责处理不同的任务。
(1)、master thread
master thread是后台线程中的主线程,优先级别最高,其内部有四个循环,分别为主循环loop、后台循环background loop、刷新循环 flush loop和暂停循环suspend loop,依据数据的运行状态会在这四个循环之间进行切换。在loop主循环中又包括两种操作,分别为每1s和每10s的操作。
每1秒:
每10秒:
(2)read thread 负责把日志缓冲中的内容刷新到redo log文件中
(3)、change thread负责将插入缓冲(change buffer)中的内容刷新到磁盘中
(4)、read/write thread是负责数据库读写请求线程,默认值都是4个
(5)、page cleaner thread是负责脏页刷新的线程
(6)、purge thread负责删除无用的undo页
(7)、checkpoint thread线程作用是在redo log 发生切换时,执行checkpoint。
(8)、error monitor thread 是负责数据库报错的线程
(9)、lock monitor thread 是负责锁的监控线程
在Oracle和MySQL数据库中,讲究日志先行的策略,就是DML语句进入到数据库之后,先写日志,再写数据库文件。
(1) redo log
MySQL默认下至少有两个数据库文件,在磁盘上用ib_logfile(0~N)命名。redo log 写的方式是顺序写、循环写。写满文件后执行切换操作,并执行checkpoint,触发脏页的刷新。而且MySQL重启时,如果参数文件中的redo log值大小与当前的redo log 不一致,会将现有的redo log删除,在重新按照参数重新生成新的redo log 文件,而在生成新的redo log文件之前,数据是先写在redo buffer中的。
redo buffer 刷新到磁盘的条件:
(2)、binlog
DML 语句会写redo log文件,也会写bing log 文件,binlog文件用于主从备份恢复和主从复制的。binlog可以通过sync_binlog 参数来控制,或者cache满了之后才会同步到磁盘。
MySQL两阶段提交过程分为prepare和commit阶段:
(1)、准备阶段(transcation prepare):事务SQL语句先写入redo log buffer,然后做一个事务的准备标记,再将log buffer中的数据刷新到redo log。
(2)、提交阶段(commit):将事务产生的binlog写入文件,刷入磁盘
再将redo log中做一个事务提交的标记,并把binlog写成攻标记也一并写入redolog 文件
而若是在准备阶段后发生发生问题,只需要执行回滚操作就可以保证数据库之间的一致性,若是在提交成功后发生宕机,只需要redo一次就可以保证数据库之间的一致性
脏页的刷新的条件:
(1)、重做日志ib_logfile 文件写满后,在切换的过程中会执行checkpoint,会触发脏页的刷新
(2)、通过innodb_max_dirty_pages_pet参数的值控制。
(3)、由innodb_adaptive_flushing参数控制,该参数影响每秒脏页刷新的数目,即主线程每秒刷新脏页
MySQL的两大索引是B+树索引和hash索引,
1、B+树索
B+树索引是有二叉树—平衡二叉树—B-树—B+树演变而来:
而依据B+树索引又分为聚簇索引和非聚簇索引:
可以通过explain 来看数据是否使用索引,一般先看type,如果type为all就不必继续往下看,再看key列,如果为null,不必往下看,然后再看rows列,该列表示预估扫描的行列数,最后再看extra列
2、Hash 索引
哈希索引采用哈希算法,把键值转换成新的hash值,检索时不需要想B+索引那样从根节点遍历到叶子结点逐级查找,只需要进行一次hash算法即可定位。需要注意的是hash索引只适用于等值查询,不支持排序、范围、模糊查询等。
事务其实就是一组DML 语句的集合,MySQL InnoDB支持事务。MyISAM 不支持事务,而且MySQL的事务默认都是自提交模式,想要开启事务,必须begin命令开始,以commit或者rollback命令结束
1、事务的特性
原子性(Atomicity)
事务的原子性是指事务中包含的所有操作要么都做要么都不做,保证数据的一致性
一致性(Consistency)
一致性是指数据库中的数据在事务操作前和事务处理后,必须满足业务的规则约束。如在转账的过程中,甲乙账户的总金额的转账前和转账后必须一致.简单的理解就是要符合常识,不存在我成功插入数据但数据库不存在的情况。
隔离性(Isolation)
隔离性是指数据库允许多个并发事务同时对数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致性。
4.持久性(Durability)
事务处理结束后,对数据的修改是永久的,即便发生故障也不会丢失。
MySQL的事务默认是自提交的模式,如果关闭自提交,在对个事务提交的期间,若其中一个事物发生了问题,那其他事务会等待行锁,这样会影像数据库的TPS。
2、 事务的隔离级别
MySQL InnoDB存储引擎实现了SQL标准的4种隔离级别,用来限定事务内哪些是可见的哪些是不可见的,低级别的隔离级别可支持更高的并发处理,并拥有更低的系统开销,MySQL的默认隔离级别是REPEATABLE-READ
MySQL的锁机制比较简单,最显著的特点就是不同的存储引擎支持不同的锁机制,InnoDB支持行锁,有时也会升级为表锁,MyIsAM只支持表锁
1、InnoDB的锁类型:
2、InnoDB的行级锁
行级锁的种类有三种:
[1] Query Cache 建议关闭,即将query_cache_size 置为0,query_cache_type 置为off
[2] 由于Memory引擎不持久化,所以数据库重启就会失掉,而redis 有RDB和AOf两种持久化,所以缓存一般选用Redis不选用MySQL的Memory引擎
[3] OLTP 是指关系型数据库系统
[4] OLAP 是指数据仓库系统,MySQL也可以用作数据仓库,但和hive的选用一般看数据量级别
[5] InnoDB逻辑存储单元为表空间、段、区、页
层级关系为tableSpace -->segment–>extent(64个page,1M)–>page–>行.
[6] redo log 记录的是页的物理操作,如果页损坏了,则无法进行数据库的任何恢复操作。即如果redo log 完成,在写入数据时,写入一发生错误,这是物理页是不完整的,无法通过redo log来恢复
参考:张甦–《MySQL王者晋级之路》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。