一,mysql体系结构

  连接层:主要完成一些类似于连接处理,授权认证,以及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

  服务层:核心服务功能,如sql接口,sql分析和优化,内部内置函数的执行,缓存,所有跨存储引擎的功能也在这一层实现,如过程,函数。

  引擎层:存储引擎就是存储数据,建立索引,更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以被称为表类型。存储引擎真正的负责了mysql中数据的存储和提取,服务器通过API和存储引擎进行通信,不同的存储引擎具有不同的功能。

  存储层:将数据存储在文件系统之上,并且完成与存储引擎的交互。

InnoDB存储引擎:InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在Mysql5.5之后称为了Mysql默认的存储引擎。

  特点:DML操作遵循ACID模型,支持事物;  

    行级锁,提高并发访问性能;
    支持外键 约束,保证数据的完整性和正确性;

  文件:xxx.ibd innoDB引擎的每张表都会对应这样的一个表空间文件,存储该表的表结构(frm,sdi),数据和索引。

  逻辑存储结构

    table space 表空间

    segment: 段

    extent:区 ,默认为1M

    page:页 16k 

    row 行

MyISAM存储引擎:

  特点:不支持事物,不支持外键

    支持表锁,不支持行锁
    访问速度快

  文件: xxx.myd 存储数据;xxx.myi存储索引;xxx.sdi 存储表结构

二,Mysql锁

  锁的概述:锁是计算机协调多个进程或线程并发访问某一资源的机制,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

  锁的分类: 按照锁的粒度 分为全局锁,表锁,行级锁。

    全局锁:对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,ddl语句,已经更新操作的事物提交语句都将被阻塞。使用场景 数据库全库逻辑备份 

      #加锁

      flush tables with read lock;

      #数据备份  

      mysqldump -uroot -p123456 test>test.sql  

      #解锁

      unlock tables;

    表级锁:每次操作锁住整张表,锁定的粒度大,发生锁冲突的概率高,并发度最低,应用在MyISAM,INNODB,DBD等存储引擎中。

      表锁的分类:表共享读锁和表独占写锁,加锁sql  lock table table_name... read/write,释放锁 unlock tables 或者 客户端断开连接,锁自动释放。

      元数据锁:meta data lock 加锁过程时系统自动控制的,无需显式使用,在访问一张表的时候会自动加上,主要作用是维护表元数据的数据一致性。在表上有活动事物的时候,不                                   可以对元数据进行写操作。为了避免DML和DDL冲突,保证读写的正确性。在MYSQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁;当对表结构                                   进行变更操纵时加MDL写锁

          意向锁:为了避免DML在执行时,加的行锁与表锁冲突,在InnoDB中引入了意向锁,使得表锁不用检查每条记录是否加锁,使用意向锁来减少表锁的检查。

    行级锁:每次操作锁住对应的行数据。锁定粒度最小,发生冲突的概率最低,并发读最高,应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织存储的,行锁是通过对索引上的                      索引项加锁来实现的,而不是对记录加的锁,对于行级锁,主要分为以下三类:

      行锁(Record Lock): 锁的单个行的记录,防止其他事物对此行进行update和delete.在RC,RR事物隔离级别下都支持。Innodb中实现了两种类型的行锁,共享锁和排他锁。

        共享锁:允许一个事物去读一行,阻止其他事物获得相同数据集的排他锁。

        排他锁:允许获取排他锁的事物更新数据,阻止其他事物获得相同数据集的共享锁和排他锁。

      间隙锁(Gap Lock):锁定索引记录间隙,不含该记录,确保索引记录间隙不变,防止其他事物在这个间隙进行insert,产生幻读,在RR隔离级别下都支持。

      临键锁(Next-Key Lock):行锁和间隙锁的组合,同时锁住数据,并锁住数据前面的间隙Gap, 在RR隔离级别下支持 。