mysql 和 mysqld
简答来说 mysql 是一个客户端的软件(命令行工具),通过它可以和 mysqld 进行连接,处理 sql 语句或 sql 文件。而mysqld 则是后台的服务程序
mysql 实例
实例 = mysqld后台进程 + Master thread + 干活的进程(worker thread包括IO、sql等)+ 预分配内存结构
mysqld 程序结构
结构化的查询语言
- DQL 数据查询语言
- DDL 数据定义语言
- DML 数据操作语言
- DCL 数据控制语言
连接层
(1)提供连接协议(socket、TCP/IP)
(2)验证用户密码和账号
(3)提供专用连接线程(接收 SQL,返回结果)
show processlist;
sql 层
(1)检查 SQL 语法
(2)验证语义(判断是那种类型):DQL、DDL、DML、DCL
(3)验证权限
(4)解析器:解析预处理(得出所有的方案),如A方案(全表)、B方案(索引)(最终得出执行计划)
(5)优化器(帮助我们选择最优的方案):基于const
(6)执行器:按照优化器的选择,执行 SQL 语句,得出执行结果(数据在磁盘上的位置,xx段、xx区、xx页)
(7)query_cache(查询缓存):默认不开启,可以使用 redis 进行缓存
(8)记录日志(默认不开启)
存储引擎层 (engine)
和磁盘打交道
相当于linux中的文件系统
逻辑结构
mysql
库 库名 + 属性
表 表名 + 表属性 + 表内容 + 列
Linux
目录 目录名 + 属性
文件 文件名 + 属性 + 文件内容
物理存储结构
段:一个表(分区表除外)就是一个段,可以有一个或者多个区组成
区:一个区(簇),默认1M,连续的64个pages
页:一个页,默认16KB,连续的4个OS block,最小的TO单元
OS block : 文件系统块,默认是4KB,连续的8个扇区
扇区: 默认512字节(0.5K),连续的512字节长度的磁盘区域
为了顺序IO,简单点就是为了连续读取或写入数据方便
一个区(1M) = 64个页
一个页(16KB)= 4个OS block
一个 OS block(kKB) = 8个扇区