01-MySQL体系结构与存储引擎

MySQL 被设计为一个可移植的数据库,几乎在当前所有系统上都能运行。尽管各平台在底层实现方面都各有不同,但是 MySQL 基本上能保证在各平台上的物理体系结构的一致性。

1. 定义数据库和实例

在数据库领域中有两个词很容易混淆:“数据库”(database) 和 “实例”(instance),这两个术语的定义如下。

  • 数据库:物理操作系统文件或其他形式文件类型的集合。
  • 实例:数据库实例由后台线程以及一个共享内存区组成。

数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;数据库实例是程序,是位于用户和操作系统之间的一层数据管理软件。用户或应用程序对数据库的任何操作,都必须通过数据库实例进行。

MySQL 被设计为一个单进程多线程架构的数据库,也就是说 MySQL 数据库实例在操作系统上的表现就是一个进程。

当启动实例时,MySQL 数据库会去读取配置文件,根据配置文件中的参数来启动数据库实例。通过如下命令可以查看当 MySQL 数据库实例启动时,会去哪些位置查找配置文件。

localhost:~ xukun06$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

如果没有配置文件,MySQL 会按照编译时的默认参数设置启动实例。

如果多个配置文件中出现同一个参数,MySQL 会以读取到的最后一个配置文件的参数为准。

2. MySQL 体系结构

MySQL体系结构图

从图中可见,MySQL 由以下几部分组成:

  • 连接池组件
  • 管理服务和工具组建
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲组件
  • 插件式存储引擎
  • 物理文件

MySQL 数据库区别于其他数据库的最重要的一个特点就是其插件式的存储引擎。需要注意的是,存储引擎是基于表的,而不是数据库。

3. MySQL 逻辑架构

MySQL逻辑架构简图

MySQL 逻辑架构主要分为如下三层:

  • 服务层:完成连接处理、授权认证和安全认证等功能。
  • 核心层:进行查询的解析、分析、优化和缓存;处理内置函数;所有跨存储引擎的功能都在这一层完成,比如视图、存储过程和触发器等。
  • 引擎层:负责数据的存取和事务的处理。

MySQL逻辑架构详图

在解析查询之前,如果查询缓存是打开的,会先判断这个查询是否命中缓存,如果命中缓存则直接返回缓存的结果。这种情况下查询不会被解析,也不会生成执行计划,更不会被执行。

所谓的”查询缓存“,可以理解为一个类似于 HashMap 的数据结构,key 是根据查询本身、目标数据库、客户端协议版本号以及其他一些可能会影响查询结果的元素计算得来,value 是该查询的结果。所以,两个查询有任何字符的不同,包括空格和注释,都会导致缓存没有命中。另外,如果查询中含有自定义函数、时间、用户变量或临时表等,这种查询都不会被缓存,因为这些查询会因为不同用户或在不同时间执行得到不同的结果。比如查询中包含 NOW() 函数。

当表的数据或结构发生变化,和这张表相关的查询缓存都会失效。所以,如果查询缓存比较大或碎片较多,将缓存置为失效的操作会带来很大的性能开销。因此,对于写密集型应用来说,不建议开启查询缓存。

4. MySQL 存储引擎

插件式存储引擎是 MySQL 区别于其他数据库的一个最重要特性。存储引擎的好处是:每个存储引擎都有各自的特点,能够根据具体的应用建立不同的存储引擎表。

通过如下命令可以查看当前 MySQL 数据库支持哪些存储引擎。

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

4.1 InnoDB 存储引擎

InnoDB 存储引擎支持事务,设计目标主要面向在线事务处理(OLTP)应用,特点是行锁设计、支持外键,并支持类似于 oracle 的非锁定读,即默认读取操作不会产生锁。从 MySQL 5.5.8 版本开始,InnoDB 存储引擎是默认的存储引擎。

InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个空间像黑盒一样由 InnoDB 存储引擎自身进行管理。从 MySQL 4.1 版本开始,可以将每个 InnoDB 存储引擎的表单独存放到一个独立的 ibd 文件中。

InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准的四种隔离级别,默认是 REPEATABLE 级别。同时,使用一种被称为 next-key locking 的策略避免幻读。此外,InnoDB 存储引擎会提供了插入缓冲、二次写、自适应哈希索引和预读等高性能和高可用的特性。

对表中数据的存储,InnoDB 存储引擎采用了“聚集”的方式,每张表的存储都是按主键逻辑顺序进行存放。如果在表定义时没有指定主键,InnoDB 存储引擎会为每一行生成一个不可见的 6 字节的 ROWID,并以此作为主键。

4.2 MyISAM 存储引擎

MyISAM 存储引擎不支持事务,表锁设计,支持全文索引,主要面向一些 OLAP 数据库应用。

MyISAM 存储引擎表中,frm 文件存储表定义,MYD 存放数据文件,MYI 存放索引文件。

MyISAM 存储引擎的缓冲池只缓存索引文件,不缓冲数据文件,这点和其他大多数使用 LRU 算法缓存数据的数据库大不相同。数据文件的缓存交由操作系统本身来完成。

4.3  InnoDB vs MyISAM

  MyISAM InnoDB
数据文件 frm + MYD +MYI ibd
缓存 只缓存索引文件 缓存索引和数据
事务 不支持 支持
外键 不支持 支持
支持的索引
  • B-Tree 索引
  • 全文索引
  • B-Tree 索引
  • 全文索引
  • (自适应)哈希索引
表锁 行锁
  对索引进行压缩 不压缩
select * from table 返回保存的行数 全表扫描返回行数
delete from table 重新建表 一行一行删除

猜你喜欢

转载自www.cnblogs.com/leoxk/p/9049221.html
今日推荐