MySQL 的逻辑架构图设计图
连接/线程处理:
管理客户端连接/会话[mysql threads]
解析器:
通过检查SQL查询中的每个字符来检查SQL语法,并为每个SQL查询生成 SQL_ID。
此外,身份验证检查(用户凭据)将在此阶段发生。
优化程序:
根据存储引擎创建有效的查询执行计划。它将重写一个查询。示例:InnoDB具有共享缓冲区,因此优化器将从中获取预缓存的数据。使用表统计信息优化器将为SQL查询生成执行计划。
授权检查(用户访问权限)将在此阶段发生。
元数据缓存:
缓存对象元数据信息和统计信息。
查询缓存:
来自内存的共享相同查询。如果在查询缓存中找到来自客户端的相同查询,则MySQL服务器从查询缓存中检索结果,而不是再次解析和执行该查询。它是会话的共享缓存,因此可以发送一个客户端生成的结果集以响应另一个客户端发出的相同查询。查询缓存基于SQL_ID.SELECT数据进入视图是使用查询缓存预缓存数据的最佳示例。
密钥缓存:
缓存表索引。在 MySQL 中密钥是索引(在oracle密钥是约束),如果索引大小小,那么它将缓存索引结构和数据叶。如果索引很大,那么它将只缓存索引结构。由MyISAM 使用存储引擎。
存储引擎:
管理物理数据(文件管理)和位置的MySQL组件。存储引擎负责执行SQL语句并从数据文件中获取数据。用作插件,可以从运行MySQL服务器加载/卸载。其中一些引擎如下:
- InnoDB:
- 完全事务性的ACID。
- 为事务提供REDO和UNDO。
- 数据存储在表空间中:
- 多个数据文件
- 使用InnoDB数据和日志缓冲区的逻辑对象结构- 行级锁。
- NDB(适用于MySQL群集):
- 完全事务性和ACID存储引擎。
- 分配执行数据并使用多个mysqld。
- NDB为每个NDB引擎使用具有自己的缓冲区的逻辑数据。
- 为交易提供REDO和UNDO。
- 行级锁。
- MyISAM:
- 非事务性存储引擎
- 读取速度快(读多写少)
- 数据存储在文件中并使用密钥,元数据和查询缓存
- 表结构的FRM
- 表索引的MYI
- 表数据的MYD- 表级锁定。
- Memory:
- 非事务性存储引擎
- 除表格元数据和结构外,所有数据都存储在内存中。
- 表级锁定。
- ARCHIVE:
- 非事务性存储引擎,
- 存储大量压缩和未编制索引的数据。
- 允许INSERT,REPLACE 和 SELECT,但不允许 DELETE 或 UPDATE sql操作。
- 表级锁定。
- CSV:
- 使用逗号分隔值格式在平面文件中存储数据。
- 需要在MySQL服务器(.frm)中创建表结构
SQL执行
sql 语句查询是首先会去缓存中查找是否有相同语句的记录,没有则会检查 sql 的句法并且生成一个 sql 查询 id,然后是优化查询的 sql 并执行语句,从存储引擎中查找数据。
MySQL连接:
InnoDB存储引擎:
- 完全事务性的ACID。
- 行级锁。
- 为事务提供REDO和UNDO。
- 表空间中的数据存储:
- 多个数据文件
- 使用InnoDB数据和日志缓冲区的逻辑对象结构
- 使用共享文件存储对象[数据和索引在同一个文件中]
- InnoDB数据是逻辑结构的100%,物理存储的数据。
- InnoDB读取物理数据并构建逻辑结构[Blocks and Rows]
- 逻辑存储称为TABLESPACE。
InnoDB存储引擎架构:
表空间:
InnoDB 的存储分为表空间。表空间是与多个数据文件(对象)相关联的逻辑结构。每个表空间都包含页面(块),范围和段
页数(pages): InnoDB的最小数据也称为块。默认页面大小为16kb,页面可以包含一行或多行,具体取决于行大小。
可用页面大小:4kb,8kb,16kb,32kb,64kb
变量名称:innodb_page_size
需要在初始化 mysqld 服务器之前进行配置。
范围(extends): 它是一组页面。为了获得更好的 I / O 吞吐量,InnoDB 读取或写入一组页面,即一次一个范围。
对于一组默认页面大小为 16kb 的页面,范围大小最大为 1MB。
Doublewrite 缓冲区一次读取/写入/分配或释放数据到一个范围。
段(Segments): InnoDB表空间中的文件集合。段中最多使用 4个范围。
InnoDB组件:
In Memory:
InnoDB 缓冲池:
InnoDB 存储引擎的中央缓冲区。在这个数据缓冲区中,我们加载块和缓存表和索引数据。
- InnoDB 缓存表数据和索引的主存。
- 在专用数据库服务器上调整高达80%的物理内存。
- 跨所有会话的共享缓冲区。
- InnoDB 使用 LRU(最近最少使用)页面替换算法。
- 正在重用的数据始终位于同一内存中。
- 不使用的数据最终将被淘汰。
更改缓冲区:
在内存更改缓冲区是 InnoDB 缓冲池的一部分,在磁盘上,它是系统表空间的一部分,因此即使在数据库重启后索引更改仍保持缓冲。更改缓冲区是一种特殊的数据结构,可以将更改缓存到二级索引页当受影响的页面不在缓冲池中时。
redo 日志缓冲区:
用于 redo 日志的缓冲区,保存数据以写入 redo 日志。定期将数据从 redo 日志缓冲区刷新到 redo 日志。将数据从内存刷新到由 innodb_log_at_trx_commit 和 innodb_log_at_timeout 配置选项管理的磁盘。
- 比较大的 redo 日志缓冲区可以在事务提交之前运行大型事务,而无需将 redo 日志写入磁盘。
- 变量:
innodb_log_buffer_size(默认为16M)