本章节主要是先笼统的介绍一些概念,一些细节后续详细介绍
1.1mysql的逻辑架构
最上层的服务不是,mysql所独有的,主要用于连接处理,授权认证,安全等。
第二层是mysql的核心层,所有核心功能都在这一层,包括查询解析,分析,优化,缓存
以及所有的内置函数,所有跨存储引擎功能 都在这 一层实现:存储过程,触发器,
视图等。
第三层包含了存储引擎,负责mysql中数据的存储和提取。
1.2事务隔离级别
1 read_uncommited(未提交读):事务没提交,修改对其他可见,也可以称为脏读
2 read commited(提交读):只能看到已经提交的修改,也可以叫不可重复读
3 repeatable read(可重复读):mysql的默认事务隔离级别
可能导致大量超时以及锁竞争的问题,实际很少使用这种级别
1.3事务日志
使用事务日志,存储引擎在修改表数据时只需要修改内存拷贝,再将修改行为记录到
硬盘上的事务日志中,如果数据修改已经记录到事务日志并持久化,但数据本身没有
写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复修改的数据。
1.4多版本并发控制(MVCC)
InnoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚(这是相对比
较简单的死锁回滚算法)
可以认为MVCC是行级锁的变种,但是在很多情况下,避免了加锁的操作,因此锁的开
销更低。虽然实现机制有所不同,但是大都是非阻塞的读操作,写操作也只锁定必要的行。
MVCC是通过保存数据在某个时间点的快照来实现的,不同的存储引擎的MVCC的实现是
不同的,典型的有乐观并发控制和悲观并发控制。
InnoDb的MVCC,是通过在每行记录后面保存两个隐藏列来实现的,一个是行创建时间,
一个是行过期(删除)时间,这里的时间指的是系统的版本号,每开启个新的事务系统
版本号会增加。
下面是repeatable read隔离级别下,mvcc的操作:
SELECT
InnoDb只查找版本早于当前事务版本的数据行,这样确保事务读取的行,要么是
打开前已经存在的,要么是自身事务插入或者修改过的行的删除要么未定义,要么
大于当前事务的版本号,确保事务读取到的行在事务开始之前未删除。
INSERT
为新插入的每一行保存当前系统的版本号作为行版本号
DELETE
为删除的每一行保存当前系统版本号作为删除的版本号
UPDATE
插入新纪录保存当前系统的版本号作为行号,同时保存当前系统的版本号到原
来的行作为删除标识
1.5存储引擎
InnoDB
InnoDb是mysql的默认存储引擎,自身支持事务,Innodb的性能和自动崩溃
恢复的特性,使得他在非事务型存储的需求中也很流畅。
Innodb的数据存储在表空间中,表空间由一系列数据文件组成,4。1版本以后,
Innodb将每个表的数据和索引放在单独的文件中。
Innodb采用MVCC来支持高并发,并实现了4个标准的隔离级别。默认是
reoeatable read,并通过间隙锁策略防止幻读的发生。
Innodb表是基于聚簇索引建立的,聚簇索引对主键查询有很高的性能。
作为事务型存储引擎,InnoDB通过一些机制和工具支持真正的热备份,
mysql的其他存储引擎不支持热备份,要获取一致性视图需要停止对所
有表的写入。
MyISAM
在mysql5.1之前的版本,MyISAM是默认的存储引擎,它提供了大量的
特性,全文索引,压缩,空间函数等,但是它不支持事务和行级锁,最大
的缺陷就是崩溃后无法恢复,但是也不是一无是处,对于只读数据,或者
表比较小,可以忍受修复操作的,可以使用。。该引擎设计简单,数据以
紧密格式存储,所以在某些场景下性能很好对于MyISAM的表创建了以后不
会再修改的,可以采用压缩表,压缩表可以极大的减少空间占用,压缩表也
是支持索引的,但是索引是只读的。
Memory
如果需要快速访问数据,并且这些数据不会被修改,重启以后丢失也没有关
系,那么memory表是非常有用的,它要比MyISAM快一个数量级,因为所有
的数据保存在内存中,不需要磁盘的I/O操作,Memory表的结构重启以后还
会保留,就是数据会丢失。
例如,可以有以下应用场景:
用于查找或者映射表
用于缓存周期性聚合数据的结果
用于保存数据分析产生的中间数据
memory支持hash索引,因此查找操作非常快,是表级锁,因此并发写入性能
较低。