《MySQL技术内幕》1~3章笔记
Last updated: Oct 289, 28089
前言
在阅读姜承尧大大《MySQL技术内幕》的同时,我买了台阿里云服务器,并在上面安装了 5.6.44 版本的 MySQL,以便进行书中的实践。
在看完了本书的前3章后,我觉得有必要停下来从头复习一遍,并思考曾看过的一些内容,故记笔记于此。
数据库与实例
数据库
物理操作系统文件或其他形式文件类型的集合,是由文件组成
实例
由后台线程以及一个共享内存区组成
架构
MySQL数据库实例在操作系统上的表现是一个进程,架构是单进程多线程
Oracle 是多进程的架构,但它的 Windows 版本也是单进程多线程
存储引擎
InnoDB存储引擎
支持事务
面向的是 在线事务处理(OLTP) 的应用
行锁设计、支持外键、非锁定读
从5.5.8版本开始,成为默认的存储引擎
使用 MVCC 获得高并发性
使用 next-key locking 避免幻读
MyISAM存储引擎
- 不支持事务
- 面向的是 在线分析处理(OLAP) 的应用
- 表锁设计、支持全文索引
NDB存储引擎
- 是一个集群存储引擎,类似于 Oracle 的 RAC 集群
- 与 Oracle RAC 不同的是,其集群架构是 share nothing 的,能提供更高的可用性
- 数据全部放入内存中,主键查找速度非常快
- 缺点:JOIN 操作是在数据库层完成的,复杂的连接操作网络开销较大
其他
Memory 存储引擎
Archive 存储引擎
Federated 存储引擎
Maria 存储引擎
等等
实践
查看当前 MySQL 支持的存储引擎,使用命令:
SHOW ENGINES\G
连接 MySQL
连接 MySQL 操作的本质是 连接进程 和 MySQL 数据库实例 的 进程间通信
常见的进程间通信方式有:
- 管道
- 命名管道
- 共享内存
- TCP/IP 套接字
- UNIX 域套接字
TCP/IP
任何平台都支持,是网络中使用得最多的一种方式
使用命令:
mysql -h host_ip_address -u user_name -p password
UNIX域套接字
在 Linux 和 UNIX 环境下,可以使用 UNIX 域套接字
只能当 MySQL 客户端 与数据库实例处在同一台服务器下才能使用
使用命令:
mysql -u user_name -S path_to_socket
可以通过如下命令查询 socket 文件的位置
SHOW VARIABLES LIKE ‘socket’;
InnoDB 存储引擎
特点:行锁设计、支持 MVCC、支持外键、提供一致性非锁定读
从 MySQL 5.5 版本开始是默认的表存储引擎
是第一个完整支持 ACID 事务的 MySQL 存储引擎
InnoDB 体系架构
后台线程
作用:
- 负责刷新内存池中的数据,保证缓冲池中的内存 缓存的是最近的数据
- 将已修改的数据文件刷新到磁盘文件
- 保证数据库发生异常时,InnoDB 能恢复到正常运行状态
MySQL 是一个单进程多线程模型,有以下线程:
- Master Thread
核心的后台线程
负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性
包括:刷新脏页、合并插入缓冲、UNDO 页的回收等
- IO Thread
InnoDB 引擎大量使用 AIO(Async IO)来处理写 IO 请求
IO Thread 负责这些 AIO 请求的回调
包括 4 个 read thread 和 4 个 write thread
读线程 ID 总是小于写线程
可以使用
SHOW VARIABLES LIKE 'innodb_%io_threads'\G
查看线程个数
- Purge Thread
事务提交后,其使用的 undolog 可能不再需要
Purge Thread 主要负责回收已经使用并分配的 undo 页
使用
SHOW VARIABLES LIKE 'innodb_purge_threads'\G
查看 Purge 线程个数可以增加该线程个数:
- 加快 undo 页的回收
- 能进一步利用磁盘的随机读取性能
- Page Cleaner Thread
负责将脏页刷新到磁盘中
原本该功能在 Master Thread 中,这样做减轻了 Master Thread 的工作
以及减少用户查询线程的阻塞,从而进一步提高 InnoDB 存储引擎的性能
内存池
作用:
- 维护所有进程/线程需要访问的多个内部数据结构
- 缓存磁盘上的数据以便快速读取,同时在修改磁盘文件数据之前在这里缓存
- 重做日志缓冲等