一.Mysql 体系结构
连接client
|
连接池
|
存储引擎(并发性,事务支持,引用完整性,物理存储,索引支持,内存高速缓冲,)
|
磁盘
1,数据库是啥?
数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储中的数据集合;
2,数据库实例是什么?
实例是程序,用于操作数据库,是位于用户与操作系统之间得一层数据管理软件,用户对于数据库得任何操作(update
inset,select,delete)都是在数据库实例中进行,应用程序只有通过数据库实例才能与数据库打交道;
3,MySQL 组成部分:
连接池组件
管理服务 和 工具组件
Sql接口组件
查询分析器组件
优化器组件
缓冲 组件
插件式存储引擎
物理存储;
4,存储引擎
存储引擎是底层物理结构得实现,每个存储引擎开发者可以按照自己得意愿来进行开发;存储引擎是基于表得而不是数据库;
(1)InnoDB: 支持行锁设计,支持外键,
Online transaction Processing :在线事务处理
(2)MyIsam:不支持事务,行级锁
(3)NDB: 一种集群存储引擎,数据全部放在内存中,查找主键速度非常快,并且可以通过添加NDB数据存储节点可以线性得提高数据库性能,是 高可用和高性能得集群系统;
缺点:ndb存储引擎得连接操作是在mysql数据层完成,不是在存储引擎完成,
所以需要大量得io操作,巨大得网络开销;
(4)Memory 存储引擎
数据存储在内存中,如果数据库发生重启,或者是奔溃,表中得数据都将会消失,使用得hash索引,只支持表锁,并发性差
(5)Archive
只支持Insert和 select 操作,使用zlib 算法进行压缩数据,然后进行存储,压缩比可达到1:10,使用行级锁来实现并发操作;
(6)Federated 连接,链接
不存放数据,指向另一台服务器上得表.
Mydql>show engines\G; 查看当前表所支持得存储引擎;
5,连接mysql
连接:mysql -uhonor -p
show databses;
use honor_account_log
show tables;
二.InnoDB 存储引擎:
完整得支持 ACID 事务, 特点是行锁设计,MVCC(Multi-version Concurrency Control 多版本并发控制),支持外键,提供一致性非锁定读;
(1)后台线程:InnoDB 存储引擎是多线程模型,后台有多个不同得后台线程,负责处理不同得任务;
a,Master Thread:后台核心线程,负责将缓冲池中得数据异步刷新到磁盘, 保证数据得一致性
b,IO thread:使用大量得aio 来处理io请求,,IO Thread 得工作主要是负责这些io 请求得回调处理. read write;
mysql>show variables like 'innodb_%io_thread'\G;
*************************** 1. row ***************************
Variable_name: innodb_read_io_threads
Value: 8
*************************** 2. row ***************************
Variable_name: innodb_write_io_threads
Value: 8
查看当前read io thread 和 write io thread;
c.purge Thread
事务提交之后,使用得undolog就不在有用,需要被清理掉
三. 内存
内存:
1.缓冲池:InnoDB存储引擎是基于磁盘存储的,并将其中 的管理方式按照页进行管理,磁盘操作速度太慢,所以需要一层缓存;
是将读到的页,放在一块内存中,下次读取相同的页时,先判断缓存中是否该页,有的话就直接读取(这叫做缓存命中),没有命中就去 磁盘中读取;数据库中页的修改,是先修改缓存中的数据,然后在以一定的频率刷新到磁盘上;checkpoint 的机制刷新回磁盘,
mysql>show variables like 'innodb_buffer_pool_size'\G; 查看innodb配置的缓冲池大小
2.内存结构包含:索引页,数据页,undo页,插入缓存(insert buffer),自适应hash索引(adapter hash index),innoDB 存储的锁信息(lock info),数据字典信息(data dictionary)
innodb包含多个缓冲池实例,通过页的hash平均分配到每个实例中,减少内部的竞争,提高并发。
mysql>show variables like 'innodb buffer-pool-instance'\G;//查看 实例的数量
3.内存区域管理:
LRU(Latest Recent used) 最近最少使用;最频繁使用的在lru的最前端,最少使用的页在最末端,当缓冲池不能存放新读取的页时,将释放lru最末端的页;页默认是16kb, innodb的lru做出了部分优化,加入了midpoint;配置点大概在5/8处,新读取到的页不是放到lru的首部,而是放在此处;
为啥需要midpoint?
-->可能某次查询占用了所有内存页,然后将lru都给占领了,本来的热数据全部被删掉,但是查询出来的大数据只是某次单次的查询,并不是热数据,那么后面查询就需要重新到磁盘中去查询了
midpoint 之前是new列表,之后是old列表;
一直往中间插,那new列表的数据永远不会删掉咯????
InnoDB 专门设置了一个参数:InnoDB_old_block_time,这个参数用来表示 页读取到mid位置后,需要等待多久才会被加入到LRU列表的热端。
Buffer Size = Free data + LRU + lock + 索引 + 。。。
当数据库刚启动的时候,LRU为空,数据页都放在free里面, 查询的时候先查询Free里面是否有空闲页,有的话讲free里面这页,然后将他放进LRU 中,如果不存在,就删除LRU末尾的页;
old列表页放大new列表的操作为page made young;
buffer pool hit rate: 缓存命中 一般命中率> 95% 小于这个数说明哪里出问题了;
4.CheckPoint
checkpoint 技术得目的是解决一下问题:
(1) 缩短数据库的恢复时间;-->当数据库宕机,checkpoint之前得页已经刷新到磁盘,日志重做只需要恢复checkpoint之后得日志,缩短恢复时间
(2)缓冲池不可用时,将脏页刷新到磁盘,->脏页是啥?缓存中得数据与磁盘中得数据不一致;当LRU不够时候,就将脏页数据刷新到磁盘
(3)重做日志不可用,刷新脏页
CheckPoint 包含:
Sharp checkpoint :发生在数据库关闭时,所有得脏页都刷新回磁盘,参数为:innodb_faset-shutdown =1,
Fuzzy checkpoint :只刷新一部分脏页;
Fuzzy checkpoint 包含: Master Thread Checkpoint
Flush_lru_List CheckPoint
Asyn/sync Flush CheckPoint
Dirty Page too much CheckPoint
四.Master Thread 工作方式
Master Thread 主要是将缓存数据 放到磁盘上