1. MySQL 体系结构
MySQL数据库的体系结构如下图所示:
- 客户端层
- 客户端连接器(Connectors)包括各种客户端程序和连接工具,如命令行客户端 mysql、图形界面工具(如MySQL Workbench),以及通过网络或本地 socket 与 MySQL 服务器建立连接的应用程序接口(APIs)。
- 连接层
- 连接池组件(Connection Pool)当客户端请求连接MySQL服务器时,负责管理这些连接。它包括连接池管理(处理新的连接请求、复用现有连接)、验证客户端的权限(通过用户名和密码),以及处理连接断开或错误。
- SQL层
- SQL接口(SQL Interface)接收用户输入的SQL语句。
- 解析器(Parser)分析SQL语句的语法。
- 查询优化器(Optimizer)选择执行查询的最佳方式。
- 缓存(Caches&Buffers)(在MySQL 5.7及之前的版本中)暂存常用查询的结果。
- 存储引擎层
- 插件式存储引擎(Pluggable Storage Engines)MySQL支持多种存储引擎,每种引擎都可以有不同的性能特性、支持的功能(如事务处理或全文搜索)和用例。
2. MySQL存储引擎介绍
以下内容摘自《MySQL技术内幕 —— InnoDB 存储引擎》第2版:
2.1. InnoDB 存储引擎
InnoDB 存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。从 MySQL 数据库 5.5.8 版本开始 InnoDB 存储引擎是默认的存储引擎。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,它可以将每个 InnoDB 存储引擎的表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用来建立其表空间。
InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准的 4 种隔离级别,默认为 REPEATABLE 级别。同时,使用一种称为 netx-key locking 的策略来避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead))等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放的。如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。
如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么 InnoDB 存储引擎是比较合适的。InnoDB 除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。