yii 框架 mysql 查询 mysql 查询流程_表空间

 

1、查询sql语句,解析sql语句

2、查询缓存,如果命中直接返回,没有则继续

3、解析器解析sql语句,生成解析树

4、调用预处理,检查表明、列名,处理别名

5、查询优化器,生成最优计划

6、调用存储引擎,查询数据

7、返回结果(生成第一条查询结果时就开始逐步返回,所以服务器不需要暂存结果)

——————————————数据库问答————————————————————————

1、数据库和实例的关系?

数据库和实例一一对应,我们无法直接操作数据库,而是要通过数据库实例来操作数据库文件

2、MySQL架构

第一层:用于连接、线程处理

第二层:对SQL的解析、分析、优化、缓存。存储过程、触发器和视图

第三层: MySQL 中真正负责数据的存储和提取的存储引擎,例如:InnoDB、MyISAM 等

3、 InnoDB 中对数据是如何存储的?

所有的数据都被逻辑地存放在表空间中,表空间(tablespace)是存储引擎中最高的存储逻辑单位,在表空间的下面又包括段(segment)、区(extent)、页(page)。

同一个实例下的页空间大小都是一样的,表空间大小默认16K

4、如何存储表?

MySQL 使用 InnoDB 存储表时,会将表的定义和数据索引等信息分开存储。其中表的定义存储在 .frm 文件中,数据索引存储在 .ibd 文件中。

表定义存储.frm文件: 创建表时,会在磁盘上的 datadir 文件夹中生成一个 test_frm.frm 的文件,这个文件中就包含了表结构相关的信息

数据索引存储在.ibd文件:.ibd 文件是每一个表独有的表空间

5、如何存储记录?

InnoDB 使用页作为磁盘管理的最小单位;数据在 InnoDB 存储引擎中都是按行存储的,每个 16KB 大小的页中可以存放 2-200 行的记录。

两种行记录格式 Compact 和 Redundant 在磁盘上按照以下方式存储:

Compact 和 Redundant 格式最大的不同就是记录格式的第一个部分;在 Compact 中,行记录的第一部分倒序存放了一行数据中列的长度(Length),而 Redundant 中存的是每一列的偏移量(Offset),从总体上上看,Compact 行记录格式相比 Redundant 格式能够减少 20% 的存储空间。

6、行数据溢出怎么办?

当 InnoDB 使用 Compact 或者 Redundant 格式存储极长的 VARCHAR 或者 BLOB 这类大对象时,我们并不会直接将所有的内容都存放在数据页节点中,而是将行数据中的前 768 个字节存储在数据页中,后面会通过偏移量指向溢出页。

但是当我们使用新的行记录格式 Compressed 或者 Dynamic 时都只会在行记录中保存 20 个字节的指针,实际的数据都会存放在溢出页面中。

7、数据页的结构是怎样的?

页是 InnoDB 存储引擎管理数据的最小磁盘单位,而 B-Tree 节点就是实际存放表中数据的页面。每一个页中包含了两对 header/trailer:内部的 Page Header/Page Directory 关心的是页的状态信息,而 Fil Header/Fil Trailer 关心的是记录页的头信息。

在页的头部和尾部之间就是用户记录和空闲空间了,每一个数据页中都包含 Infimum 和 Supremum 这两个虚拟的记录(可以理解为占位符),Infimum 记录是比该页中任何主键值都要小的值,Supremum 是该页中的最大值

8、索引的数据结构?

InnoDB 存储引擎在绝大多数情况下使用 B+ 树建立索引,这是关系型数据库中查找最为常用和有效的索引,但是 B+ 树索引并不能找到一个给定键对应的具体值,它只能找到数据行对应的页,然后正如上一节所提到的,数据库把整个页读入到内存中,并在内存中查找具体的数据行,