MySQL 技术内幕(一):体系结构

一.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 主要是将缓存数据 放到磁盘上

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值