一,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隔离级别下支持 。