1. 连接层
ü 提供连接协议:tcp/ip socket
ü 验证连接信息:用户/密码,权限,端口
ü 提供专用连接线程
ü 将SQL语句传递给SQL层
2. SQL层
ü 接收连接层传递的SQL语句
ü 语法检查
ü 语义判断:DDL、DML、 DCL、 DQL
ü 权限检查:是否对库、表有操作权限
ü 解析器解析SQL语句生成多种执行计划
ü 优化器选择成本最低的执行计划
ü 执行器执行SQL语句,得到数据存放位置
ü 查询缓存,query_cache默认不开启,可用redis替代
ü 日志记录
3. 存储引擎层
从磁盘读取数据给SQL层,SQL层将数据结构成表(mysql数据是16进制的),再通过连接层提供的线程返回给用户。
MySQL的最底层的物理结构是数据文件(就是操作系统上的一个文件)
MyISAM的表:
user.frm # 存储列相关信息
user.MYD # 数据行
user.MYI # 索引
InnoDB(5.5以后默认的存储引擎)的表:
time_zone.frm:存储列相关信息
time_zone.ibd:数据行+索引
ibdata1:共享表空间,存储数据字典,也就是 InnoDB 表的元数据
库,表,列,行
ü 库:库名+库属性:字符集,校验规则
库是存放表对象的容器(盒子)可以存放很多张表和其他对象
ü 表:表名+表属性:存储引擎,字符集
表包含元数据+真实数据行 ← =(列属性+行记录)
ü 元数据:列+其他属性(行数+占用空间大小+权限)
ü 列:列的名字+列属性:数据类型+约束(非空、唯一、主键、非负数、自增长、默认值)+其他属性
ü 数据行
什么是元数据?
所谓元数据,就是表示数据的数据,这些数据五花八门,总之,只要不是我们存储到数据库里的数据,大多都可以理解为元数据。描述数据库的任何数据—作为数据库内容的对立面—是元数据。因此,列名、数据库名、用户名、版本名以及从SHOW语句得到的结果中的大部分字符串是元数据。还包括INFORMATION_SCHEMA数据库中的表中的内容,因为定义的那些表存储关于数据库对象的信息。
InnoDB存储引擎的逻辑存储结构和 Oracle大致相同,所有数据都被逻辑地存放在一个空间中 ,我们称之为表空间 ( tablespace ) 。表空间又由段 ( segment ) 、区 ( extent ) 、页 ( page ) 组成 。页在一些文档中有时也称为块(block) , InnoDB存储引擎的逻辑存储结构大致如图4-1所示。
段:也叫表; 区:物理上连续的64个页; 页:16K大小的存储空间,也是mysql最小的存储空间 一个表就是一个段。MySQL在分配空间时最小分配一个区,每个区默认是1M(64page)
表空间可以看做是InnoDB存储引擎逻辑结构的最高层 ,所有的数据都是存放在表空间中。已经介绍了默认情况下 InnoDB存储引擎有一个共享表空间 ibdata1 ,即所有数据都放在这个表空间内 。如果我们启用了参数innodb_file_per_table ,则每张表内的数据可以单独放到一个表空间内 。