MySQL架构与历史
1.1 .1MySQL服务器逻辑架构
大致上分为三层,下面来介绍这三层的作用
-
第一层
客户端/服务端的工具都有类似的架构。比如:连接处理,授权认证等等。 -
第二层
MYSQL的核心服务功能都在这一层。比如:查询解析、优化、缓存以及内置函数(日期,数学和加密函数),存储过程,触发器,视图等。 -
第三层
存储引擎,服务器通过API与存储引擎进行通信。
存储引擎不会解析SQL,不同存储引擎之间不会相互通信。(InnoDB例外,他会解析外键定义。)
(后面会详细介绍分类)1.1.2 连接管理与安全性
线程的定义:
线程包含在进程之中。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
连接管理
每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个的单独的线程中执行。(MYSQL5.5或更新的版本,提供方了一个API,支持线程池插件,可以使用池中少量的线程来服务大量的连接) -
安全性
客户端连接MYSQL服务器时,服务器对其进行认证,包括用户名,密码等。
1.2 并发控制
当我们同时对一张表做插入或者修改时,会引发并发控制的问题。这类问题,一般通过实现一个由两种类型的锁组成的锁系统来解决问题,称为共享锁和排他锁,也叫读锁和写锁。
读锁(共享锁):读锁是共享的,或者说是相互不阻塞的,多个客户在同一时刻可以同时读取同一个资源,而且互不干扰。
写锁(排它锁):写锁会阻塞其他的读锁和写锁,一个用户在修改某个数据时,MySQL会同时阻塞其他用户对此数据的操作。
一种提高共享资源并发性的方式就是让锁对象更有选择性,尽量只锁定需要修改的部分数据,而不是所有的资源。
这里我们来讲一下**锁策略**,就是在锁的开销和数据的安全性之间寻求平衡。
1.3事务
-
原子性
整个事务中所有操作要么全部提交成功,要么全部失败回滚。 -
一致性
事务必须是使数据库从一个一致性状态变到另一个一致性状态。 -
隔离性
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 -
持久性
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响1.3.1 隔离级别
-
未提交读(脏读)
事务中的修改,即使没有提交,对其他事务也是可见的。 -
提交读
一个事务从开始到提交之前,所做的任何修改对其他事务都是不可见的。 -
可重复读
解决了脏读的问题,但产生了幻读,就是当某个事务在读取该范围的记录时,另外一个事务又在该范围插入新的记录,当之前的事务再次读取该范围的记录则产生幻行。 -
可串行化
最高的隔离级别。通过强制串行执行,避免了幻读的问题。1.3.2 死锁
死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。1.3.3 MYSQL中的事务
MYSQL提供了两种事务型的存储引擎:InnoDB和NDB Cluster。隐式和显示锁定
隐式锁定:采用两阶段锁定协议,在事务执行过程中,随时都可以执行锁定,锁只有在执行提交和回滚的市时候才释放,并且所有的锁在统一时刻被释放。InnoDB会根据隔离级别在需要的时候自动加锁。
显示锁定:通过特定的语句进行显示锁定
select … lock in share mode
select … for update
1.4多版本并发控制
MYSQL的大多数事务型存储引擎实现都不是简单的行级锁,基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)
这里看这个解释的比较好。
MVCC多版本并发控制
1.5 MYSQL的存储引擎
-
InnoDB存储引擎
InnoDB是MySQL的默认事务型引擎,也是最重要,使用最广泛的存储引擎。
InnoDB采用MVCC来支持高并发,实现了四个标准的隔离级别。
InnoDB表是基于聚簇索引建立的。(聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据)
InnoDB能够自动在内存中创建hash索引以加速读操作的自适应哈希索引,以及能够加速插入操作的插入缓冲区。 -
MyISAM存储引擎
MyISAM存在大量的特性,包括全文索引,压缩,空间函数等,但是它不支持事务和行级锁,而且崩溃后无法安全恢复。对于只读的数据,或者表小,可以忍受修复操作,则可以选择MyISAM。
MyISAM会将表存储到两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。1.5.1 MySQL 内建的其他存储引擎
-
Archive引擎
只支持INSERT和SELECT操作。在MySQL5.1之前不支持索引。适合日志和数据采集类应用。Archive引擎支持行级锁和专用的缓冲区,可以实现高并发的插入。 -
Blackhole引擎
没有实现任何的存储机制,会丢弃所有插入的数据,不做任何保存。 -
CSV引擎
可以将普通的CSV文件(逗号分割值的文件)作为MySQL的表来处理,但不支持索引。 -
Memory引擎
想要快速访问数据,并且数据不会被修改,重启丢失也无所谓,可选择使用Memory表。
1.5.2 转换表的引擎 -
ALTER TABLE
ALTER TABLE mytable ENGINE = InnoDB;
该方法适用任何存储引擎。缺点:需要执行很长时间。
- 导出导入
使用mysqldump工具将数据导出到文件,然后修改文件中的CREATE TABLE语句的存储引擎选项,同时修改表明。 - 创建与查询
创建新的存储引擎的表,在利用INSERT…SELECT语法导入数据
总结:
Mysql拥有分层的架构。上层是服务器层的服务和查询执行引擎,下层是存储引擎。MYSQL的核心基础结构的精髓是理解MYSQL在存储引擎和服务层之间处理查询时如何通过API来回交互。