在大规模水平集群的架构设计中,开源的MySQL受到的关注度越来越高。
到2012年整个淘宝网的核心交易系统已经全部运行在基于PC服务器的MySQL数据库集群中。
一、MySQL架构与历史
MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。
这种处理和存储相分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储方式。
1.1 MySQL逻辑架构
照着书上画的逻辑架构图
最上层的客户端;
第二层包含大多数MySQL核心服务功能,包括查询解析、分析、优化、缓存以及所有的内置函数。所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等;
第三层包含了存储引擎。存储引擎不会去解析SQL,不同存储引擎之间也不会相互通信。(InnoDB会解析外键定义,这是一个例外)
1.1.1 连接管理与安全性
每个客户端连接都会在服务器进程中拥有一个线程。服务器会缓存线程,因此不需要为每个新建的连接创建或者销毁线程。
1.1.2 优化与执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。用户可以通过特殊的关键字提示(hint)优化器,影响它的决策过程。也可以请求优化器解释(explain)优化过程的各个因素,使用户可以知道服务器是如何进行优化决策的,并提供一个参考基准,便于用户重构查询和schema、修改相关配置,使应用尽可能高效运行。
对于SELECT语句,在解析查询前,服务器会先检查查询缓存(Query Cache),如果能够在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。(详见第7章)
1.2 并发控制
1.2.1 读写锁
共享锁(shared lock) 和排他锁(exclusive lock),也叫读锁和写锁。
1.2.2 锁粒度
由于加锁也要消耗资源,所以理想方式是精确的锁定。
所谓锁策略,就是在锁的开销和数据的安全性之间寻求平衡。
MySQL支持多个存储引擎的架构,每种MySQL存储引擎都可以实现自己的锁策略和锁粒度。
两种重要的锁策略:表锁(table lock)和行级锁(row lock)
服务器会为诸如ALTER TABLE之类的语句使用表锁,而忽略存储引擎的锁机制。
InnoDB和XtraDB,以及其它一些存储引擎中实现了行级锁(行级锁只在存储引擎层实现,服务器层没有实现)。
1.3 事务
事务就是一组原子性的SQL查询,或者说一个独立的工作单元。
START TRANSACTION
...
COMMIT;
事务的特性ACID(atomicity,consistency,isolation,durability)
1.3.1 隔离级别
ANSI SQL隔离级别
未提交读,事务可以读取未提交的数据,被称为脏读。
提交读,大多数数据库系统的默认隔离级别。有时也叫做不可重复读,因为两次执行相同的查询,可能会得到不一样的结果。
可重复读,理论上无法解决幻读(Phantom Read)。所谓幻读,指某个事务在读取某个范围的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。
InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读,可重复读是MysSQL默认隔离级别。
可串行化,强制事务串行执行。
1.3.2 死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求对方占用的资源,从而导致恶性循环的现象。
InnoDB目前处理死锁的方式是,将持有最少行级排他锁的事务进行回滚(这是相对比较简单的死锁回滚算法)。
以同样的顺序执行语句,有些存储引擎会产生死锁,有些则不会。
1.3.3 事务日志
1.3.4 MySQL中的事务
MySQL提供了两种支持事务的存储引擎:InnoDB和NDB Cluster.
InnnoDB采用的是两阶段锁定协议。
MySQL也支持LOCK TABLES 和UNLOCK TABLES,这是在服务器层实现的。
1.4 多版本并发控制(MVCC)
可以认为MVCC是行级锁的一个变种,它在大多数情况下避免了加锁,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。
MVCC是通过保存数据在某个时间点的快照来实现的,典型的有乐观并发控制和悲观并发控制。
MVCC只在REPEATABLE和READ COMMITTED两个隔离级别下工作。
1.5 MySQL的存储引擎
InnoDB基于聚簇索引建立。
转换表的引擎有三种方式:
1)ALTER TABLE
ALTER TABLE mytable ENGINE = InnoDB;
2) 导出与导入
3)创建与查询(CREATE和SELECT)