MySQL结构知识
结构图
Connectors
用来支持各种语言和SQL的交互,比如PHP,Python,Java的JDBC
- 方式:客户端、API
- 通信协议:TCP/IP; linux下:Unix Socket
- 通信方式:同步半双工
- 同一时刻只能客户端发送数据给服务端或者服务端返回数据给客户端。
- 客户端发送SQL语句给服务端的时候,(在一次连接里面)数据是不能分成小块发送的,不管你的SQL语句有多大,都是一次性发送,服务端返回数据也是一次性的发送。
- 连接方式:长连接(默认),也支持短连接
- 长时间不活动的连接,MySQL服务器会断开。默认都是28800秒,8小时。
- MySQL服务允许的最大连接数默认是151个,最大可以设置成100000。
- 验证用户权限:user表,db表,tables_priv表,columns_priv表
Server
数据库的逻辑处理层
Management Serveices & Utilities
系统管理和控制工具,包括备份恢复、MySQL复制、集群等;
Connection Management
连接管理,连接池,管理需要缓冲的资源,包括用户密码权限线程等;
Cache and Buffer
查询缓存,除了行记录的缓存之外,还有表缓存,Key缓存,权限缓存等;
Parser
用来解析SQL语句;
- 词法解析和语法解析,生成解析树
- 预处理器 进行权限校验和语义解析重新生成解析树
Optimizer
查询优化器
- 合法的语法树,优化器将其转成执行计划
- 一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。
- 执行计划:mysql生成查询的一棵指令树,然后通过存储引擎执行完成这棵指令树并返回结果。最终的执行计划包含了重构查询的全部信息。
SQL Interface
用来接收用户的SQL命令,返回用户需要的查询结果
Storage Engines
Pluggable Storage Engines:插件式存储引擎,它提供API给服务层使用,跟具体的文件系统交互。
InnoDB
- 最开始是第三方公司为MySQL开发的。
- InnoDB是一个事务安全(与ACID兼容)的MySQL存储引擎,它具有提交、回滚和崩溃恢复功能来保护用户数据。
- InnoDB行级锁非锁读提高了多用户并发性和性能。
- 数据存储在聚集索引中,以减少基于主键的常见查询的I/O
- InnoDB还支持外键引用完整性约束。
特点
- 支持事务,支持外键,因此数据的完整性、一致性更高。
- 支持行级别的锁和表级别的锁。
- 支持读写并发,写不阻塞读(MVCC)。
- 特殊的索引存放方式,可以减少IO,提升查询效率。
适合:经常更新的表,存在并发读写或者有事务处理的业务系统。
MyISAM
- MySQL自带的存储引擎,由ISAM升级而来。
- 表级锁限制了读/写的性能,因此在Web和数据仓库配置中,它通常用于只读或以读为主的工作。
特点
- 支持表级别的锁(插入和更新会锁表)。
- 不支持事务。
- 拥有较高的插入(insert)和查询(select)速度。
- 存储了表的行数(count速度更快)。
适合:只读之类的数据分析的项目。
MEMORY
- 数据存在内存中,快速访问。以前被称为堆引擎。
- 数据集提供了快速的键值查找。
特点
- 把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失。
- 默认使用哈希索引。
只适合做临时表。
CSV
- 它的表实际上是带有逗号分隔值的文本文件。
- csv表允许以csv格式导入或转储数据,以便与读写相同格式的脚本和应用程序交换数据。
- csv表没有索引
特点
- 不允许空行,不支持索引。
- 格式通用,可以直接编辑。
适合在不同数据库之间导入导出。
Archive
- 紧凑的未索引的表用于存储和检索大量很少引用的历史、存档或安全审计信息。
特点
- 不支持索引
- 不支持update delete。
适用存档,历史。
自定义
- mysql支持自定义的存储引擎
File System
- 文件
- 硬盘
- 内存