Never too late to learn.

0%

高性能MySQL-读书笔记1

高性能MySQL第三版

[美] Baron Scbwartz, Peter Zaitsev, Vadim Tkacbenko

第1章 MySQL架构

MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。

1.1 MySQL逻辑架构

mysql1

最上层服务并不是MySQL所特有的,连接处理、授权认证、安全等。

大多数MySQL的核心服务都在第二层,包含查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。

1.1.1 连接管理与安全性

每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行。

1.1.2 优化与执行

MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。用户可以通过特殊的关键字提示(hint)优化器,影响它的决策过程。也可以请求优化器解释(explain)优化过程的各个因素,使用户可以知道服务器是如何进行优化决策的,并提供一个参考基准,便于用户重构查询和schema、修改相关配置,使应用尽可能高效运行。

1.2 并发控制

1.2.1 读写锁

在处理并发读或者写时,可以通过实现一个有两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。

读锁是共享的,互不阻塞的;写锁是排他的,一个写锁会阻塞其他的写锁和读锁。

1.2.2 锁粒度

每种MySQL存储引擎都可以实现自己的锁策略和锁粒度。

  • 表锁(table lock)

表锁是MySQL中最基本的锁策略,并且是开销最小的策略。

  • 行级锁(row lock)

行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销)。InnoDB和XtraDB实现了行级锁。行级锁只在存储引擎层实现,而MySQL服务层没有实现。

1.3 事务

事务就是一组原子性的sql查询,或者说一个独立的工作单元。事务内的语句,要么全部执行成功,要么全部执行失败。

一个运行良好的事务处理系统,必须具备ACID这些标准特性,原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。

1.3.1 隔离级别

Sql标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

  • read uncommitted(未提交读)
  • read committed(提交读)
  • repeatable read(可重复读, mysql默认事务隔离级别)
  • serializable(可串行化)

1.3.2 死锁

死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源。

1.3.3 事务日志

事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。

1.3.4 Mysql中的事务

MySQL提供了两种事务性的存储引擎:InnoDB和NDB Cluster。
mysql默认采用自动提交(AUTOCOMMIT)模式。也就是说,如果不是显式地开始一个事务,则每个查询都被当做一个事务执行提交操作。
MySQL服务层不管理事务,事务由下层的存储引擎实现。

1.4 多本版并发控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制(MVCC)。MVCC的实现,是通过保存数据在某个时间点的快照来实现的。

1.5 MySQL的存储引擎

MySQL使用文件系统的目录和文件来保存数据库和表的定义。

1.5.1 InnoDB存储引擎

InnoDB的数据存储在表空间(tablespace)中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成。
InnoDB表是基于聚簇索引建立的,聚簇索引对逐渐查询有很高的性能。不过他的二级索引(secondary index, 非主键索引)中必须包含主键列,所以如果主键列很大的话其他的所有索引都会很大。

1.5.2 MyISAM存储引擎

MyISAM不支持事务和行级锁

Coffee? ☕