mysql的组成部分

enter image description here
- 连接池组件
- 管理服务和工具组件
- sql接口组件
- 查询分析器组件
- 优化器组件
- 缓冲组件
- 插件式存储引擎
- 物理文件
一条SQL语句的执行经历了哪些流程
SQL语句 -> 查询缓存(cache) -> 解析器 -> 预处理器
-> 优化器 -> 执行计划(plan) -> 程序api -> 存储引擎
-> 调用数据

enter image description here
Mysql主流的存储引擎
存储引擎就是调用数据的方法
mysql插件式的存储引擎是基于表的,而不是数据库,mysql的核心就是存储引擎
1. 支持事物,面向在线事物处理(OLTP)方面的应用,支持行锁,支持外建
2. 通过多版本并发控制MVCC来获取高并发性,并且实现了sql标准的4种隔离级别(默认为repeatable)
3. 还提供了插入缓存(inset buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)
4. 对于表中数据的存储,innodb采用clustered.每张表的存储都按主键的顺序存放,如果没有显式的为表定义主键,innodb为每张表生成一个6字节的rowid作为主键
1. 不支持事务,表锁,全文索引,对olap在线分析处理,操作速度快
2. myisam存储引擎表由MYD和MYI组成,MYDy用来存放数据文件,MYI用来存放索引文件
3. 从mysql5.0开始,mysql默认支持256T单表数据
4. 对于myisam存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存交由操作系统本身完成,区别于使用LRU算法存放数据的大部分数据库
1. 事务的支持
innodb支持,myisam不支持
2. 锁粒度
innodb行级,myisam表级别
3. 并发性
innodb并发性高,myisam并发性低
4. 缓存机制
innodb缓存数据和索引,myisam只缓存索引
5. select count(*)
innodb慢(全表扫描),myisam快

image.png
如上图:现在假设执行语句select * from t1 where id=4;那么获取这条数据的过程中都发生了什么?
基础概念:
在mysql数据库中数据的单位分为,段,区,页,每个页对应内存中的一个buffer,这些内存中的buffer不是随意分布的,而是通过chain连接起来的,在内存中buffer是有状态的,分为free(空闲的),clean(可以清除的),dirty(脏数据),对应的会有三条链,
free list, LRU list, flush list. 从磁盘读取数据到内存是以页为单位的。
流程:
1. 现在查询id=4的这条数据,发现不在内存中,那么就需要回到磁盘读取。
2. 从磁盘中发现有id=4这条数据,于是将id=4对应的页读入内存。
那么读到内存中应该放在哪里呢?如果内存中有free状态的buffer,那么就放入free状态的buffer中,但多数情况都没有free状态的buffer可用。那么该覆盖哪块已有的buffer呢?会根据LRU算法,从其管理的clean状态的buffer中,选择不常使用的一个buffer将其覆盖。
3. 数据又是如何从内存中写入磁盘的呢?
上图中明显内存和磁盘中的数据不一致,内存中存在脏数据,那么这些脏数据是否该写入磁盘呢?在将脏数据写入磁盘时,主要看flush list管理的dirty buffer,是否需要将数据写入磁盘,还需要看LRU算法,如果dirty buffer中的数据,是经常被读取的,就暂时不会写入磁盘,如果是常时间不被读取的,会写入磁盘。
网友评论