MySQL基础
# MySQL执行流程
- 连接器:管理客户端登录,用户身份验证;
- 缓存:执行查询语句时候,先查询缓存;
- 分析器:(解析器)将SQL语句中关键字进行解析,生成一颗对应的“语法树”,来判断语法是否正确;
- 优化器:将语法树转换成执行计划,并生成MySQL认为最好的执行计划;
- 执行器:执行过程,调用存储引擎提供的api,来执行执行计划,执行之前进行权限验证,表、数据库、操作是否符合权限;
- 存储引擎:定义MySQL中数据的存储机制、索引和锁机制等。
# 存储引擎
# InnoDB和MyISAM对比
- InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
- MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
- MyISAM 不支持外键,而 InnoDB 支持。
- MyISAM 不支持 MVVC,而 InnoDB 支持。
- 虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
- MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。
- InnoDB 的性能比 MyISAM 更强大。
# InnoDB
存储引擎决定了MySQL会怎样存储引擎,怎样读取和写入数据,也很大程度决定了MySQL的读写性能和数据可靠性。
# 内存架构
- InnoDB In-Memory Structures
- InnoDb On-Disk Structures
Buffer Pool
MySQL不会直接去修改磁盘的数据,因为这样做太慢了,MySQL会先改内存,然后记录redo log,等有空了再刷磁盘,如果内存里没有数据,就去磁盘load。
Buffer Pool采用基于LRU的算法来管理内存:
Change Buffer
如果要修改MySQL的数据,并且包含该数据的页不在内存中,那么先把修改记到一个Change Buffer的地方,同时记录redo log,然后延迟将页面加载到内存中
- merge:Change Buffer -> Buffer Pool
- purge:Buffer Pool -> Disk
Adaptive Hash Index
MySQL索引,不管是内存的还是磁盘的,都是B+树,B+树的查找次数取决于树的深度。空间换时间的方法,MySQL会自动评估这张表建立这个索引是否值得。
Log Buffer
Log Buffer 里的redo log,会被刷到磁盘里
# 磁盘架构
表空间
- The System Tablespace
- File-Per-Table Tablespaces
- General Tablespace
- Undo Tablespaces
- Temporary Tablespaces