"High Performance MySQL"阅读笔记(一)

在大规模水平集群的架构设计中,开源的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,这是在服务器层实现的。

猜你喜欢

转载自www.cnblogs.com/jdbc2nju/p/10848422.html