赞
踩
虽然大部分人都会只用 mysql,但是大部分对于 mysql 的大致框架都不慎了解,虽然我也使用了很久,但是对 mysql 的了解仅仅是皮毛,这里简单对 MySQL 的重要模块进行简单剖析。
这里以 INNODB 为视角,简单介绍一下 MySQL 的重要某块和简单执行流程。
首先我们需要知道,为什么 MySQL 要有连接池。
客户端一般通过 JDBC 之类的驱动和 Mysql 进行链接。
Mysql 里一般为重要数据,为了可靠性,mysql 和 客户端的交互一般通过 TCP 协议。
不过数据库的连接并非全双工,而是半双工
那么问题来了,TCP 一般要维护链接状态,客户端一般和 MYSQL 需要频繁的数据交互。
又因为客户端相对不容易变化,所以 Mysql 使用连接池 作为一个客户端与 Mysql 连接数的一个权衡,作为提升连接效率的方案。
连接池核心参数如下,设计思路和线程池是有些类似的。
最大连接数(Max Connections):
最小空闲连接数(Min Idle Connections):
初始化连接数(Initial Connections):
在 MYSQL 内部大概分为了两层,一层是 SEVER 层,核心是 解析器,优化器,执行器,相当于 MYSQL 的前端;
一层是,存储引擎,如 INNODB 和 MYSAM,相当于 MYSQL 的后端。
查询缓存,一般在进入 SQL 的第一步进行哈希查询,如果存在 该 SQL 的 key 就直接返回,不过 MYSQL 中未默认开启工这个功能,且在 8.0 后该功能已经被移除。
原因主要如下:
SQL 接口是一种逻辑概念。MYSQL 为客户端提供了包括创建,修改 表,增删改查表等一系列功能。而这些暴露给客户端统一的进行 sql 操作的逻辑接口。
这些操作具体在进入MYSQL 会进行其他的加工操作。
查询优化器通过成本模型(cost model)来估算不同查询执行计划的成本,从而选择最有效的执行方案。这个成本通常是基于估计的资源消耗来计算的,包括磁盘I/O、内存使用、CPU 使用和网络开销等
在 INNODB 中一般有读写两种原子操作。
写入操作一般复杂一些。
MySQL 的读写操作都是面向 Buffer Pool 的。
但是在写的时候一般有 Redo log 和 Undo log 的辅助。
一般在事务提交后未刷入数据页的故障需要重做,事务未提交的故障需要回滚。
Redo log 日志是为了保证 buffer 区数据的意外恢复的,由于 Mysql 的数据处理都是面向 Buffer 的,由于是在内存中,没有持久化到硬盘中,这是不安全的,redo log 在意外停电等情况下用于buffer 区内容的恢复。
为什么 redo log 区需要刷盘? 那为什么不直接把buffer 区内容直接刷入数据页?
答: redo 日志的buffer 默认在内存也不够安全,需要通过刷盘策略刷入到硬盘。 由于redo log 日志保存是顺序保存,比直接随机刷入数据页要快。
Undo 日志是事务回滚的关键,并且和 INNODB 的核心并发机制 MVCC 有紧密的关联。
MVCC 机制
read view
。这个视图包含了以下几个关键信息:当事务尝试读取某个记录时,数据库系统会遵循以下步骤来确定应该返回哪个版本的数据:
trx_id
)。
trx_id
小于 read view
中的最小活动事务ID,并且创建该版本的事务已提交,则这个版本是可见的。trx_id
属于 read view
中的活动事务列表,则该版本不可见,因为创建它的事务还未提交。trx_id
等于当前事务的ID,这意味着当前事务自己修改了这条记录,所以这个版本是可见的。在处理删除和插入操作时,版本链的处理会稍有不同。例如,如果一条记录被标记为删除,并且删除操作是在当前事务的
read view
创建之后发生的,则这条记录对当前事务不可见。
以 INNODB 为例
.frm 文件
.frm
文件用于存储表的结构信息。这包括表的定义,如字段名、数据类型、默认值以及其他表结构相关的元数据。.frm
文件。.frm
文件格式相对独立于存储引擎,这意味着无论表使用的是 InnoDB、MyISAM 或其他存储引擎,.frm
文件都是必需的。.frm
文件是表结构存储的唯一方式。.ibd 文件
.ibd
文件是 InnoDB 存储引擎特有的文件,用于存储表的数据和索引。.ibd
文件允许 InnoDB 实现表级别的物理文件存储,这种方式称为“文件-表空间”(file-per-table tablespace)。.ibd
文件可以使得数据库备份、恢复、迁移以及维护操作更加灵活和高效。innodb_file_per_table
配置选项启用时,每个 InnoDB 表都会有一个独立的 .ibd
文件。如果该选项未启用,所有表的数据和索引将存储在共享的表空间中,通常是 ibdata1
文件。.ibd
文件支持高级功能,如压缩、行格式选择等。MySQL 8.0 及以后的变化
从 MySQL 8.0 开始,
.frm
文件被淘汰,表的结构信息改由数据字典管理,这是一个集中在 InnoDB
引擎内部的系统表集合。这个变化意味着在最新版本的 MySQL
中,表的定义信息不再存储在独立的文件中,而是直接嵌入到数据库引擎的内部结构中。这样的变化带来了更好的性能和更简单的管理。
索引可谓是重中之重,在面试中为常问考点。在 INNODB 中索引的数据结构是 B+ 树,一个类似二叉排序树的,一个节点包含更多数据的二叉树。
由于 B+ 树的特性,在 MySQL 中,索引的使用遵循左前缀匹配的原则。
tyoe类型
type
,因为 MySQL 实际上把整个表转换为一个常数。ref
可以用于非唯一索引,或者是唯一索引的非唯一部分。ref
,但 MySQL 会额外搜索包含 NULL 值的行。这在处理包含 NULL 值的联合查询中特别有用。EXTRA 关键字
ORDER BY
操作,表明索引没有被用于排序。JOIN
、排序或者子查询时发生。SELECT
子句中的表达式,或调整 JOIN
的顺序以减少处理的数据量。JOIN
操作,表明没有使用索引,MySQL 需要使用缓冲区来处理 JOIN
。JOIN
语句或增加适当的索引,以尽量避免使用大量的 JOIN
缓冲。在硬盘中一个磁盘块为4k,一个页通常为连续的4个磁盘块,在一次加载的时候加载一个页,由于是顺序读取一般情况下比较快,
段的概念允许数据库以更高层次的逻辑结构管理数据,而不是单纯依赖于物理存储细节。在 InnoDB 中,常见的段类型包括:
逻辑上的段组织带来了几个关键优势:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。