宁波奉化建设局网站,深圳网络提速优化服务包,wordpress关闭feed,网站的作用有哪些Mysql查询语句执行原理
数据库查询语句如何执行#xff1f;
DML语句首先进行语法分析#xff0c;对使用sql表示的查询进行语法分析#xff0c;生成查询语法分析树。语义检查#xff1a;检查sql中所涉及的对象以及是否在数据库中存在#xff0c;用户是否具有操作权限等视…Mysql查询语句执行原理
数据库查询语句如何执行
DML语句首先进行语法分析对使用sql表示的查询进行语法分析生成查询语法分析树。语义检查检查sql中所涉及的对象以及是否在数据库中存在用户是否具有操作权限等视图转换将语法分析树转换成关系代数表达式称为逻辑查询计划查询优化在选择逻辑查询计划时会有多个不同的表达式选择最佳的逻辑查询计划代码生成必须将逻辑查询计划转换成物理查询计划物理查询计划不仅能指明要执行的操作也给出了这些操作的执行顺序每步所用的算法存储数据的方式以及从一个操作传递给另一个操作的方式。将DML转换成一串可执行的存取操作的过程称为束缚过程
Mysql查询语句执行过程
这里简单介绍一下mysql数据库mysql数据库是一款关系型数据库所谓关系型数据库就是以二维表的形式存储数据使用行和列方便我们对数据的增删改查。 这篇博客我们以mysql数据库为例对一条sql语句的执行流程进行分析。本篇博客不涉及到表连接 首先创建一张student表字段有自增主键id学生姓名name学科subject成绩grade 建表语句 DROP TABLE IF EXISTS student;
CREATE TABLE student (id int(5) NOT NULL AUTO_INCREMENT,name varchar(10) DEFAULT NULL,subject varchar(10) DEFAULT NULL,grade double(4,1) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT40 DEFAULT CHARSETutf8; 初始化数据 INSERT INTO student(name,subject,grade)VALUES(aom,语文,88);
INSERT INTO student(name,subject,grade)VALUES(aom,数学,99);
INSERT INTO student(name,subject,grade)VALUES(aom,外语,55);INSERT INTO student(name,subject,grade)VALUES(jack,语文,67);
INSERT INTO student(name,subject,grade)VALUES(jack,数学,44);
INSERT INTO student(name,subject,grade)VALUES(jack,外语,55);INSERT INTO student(name,subject,grade)VALUES(susan,语文,56);
INSERT INTO student(name,subject,grade)VALUES(susan,数学,35);
INSERT INTO student(name,subject,grade)VALUES(susan,外语,77);INSERT INTO student(name,subject,grade)VALUES(alice,语文,88);
INSERT INTO student(name,subject,grade)VALUES(alice,数学,77);
INSERT INTO student(name,subject,grade)VALUES(alice,外语,100);INSERT INTO student(name,subject,grade)VALUES(rajo,语文,33);
INSERT INTO student(name,subject,grade)VALUES(rajo,数学,55);
INSERT INTO student(name,subject,grade)VALUES(rajo,外语,55); 复制
下面我们来看一下数据在数据库中的存储形式。 图1.0
现在针对这张student表中的数据提出一个问题要求查询出挂科数目多于两门包含两门的前两名学生的姓名如果挂科数目相同按学生姓名升序排列。
下面是这条查询的sql语句 SELECT name,COUNT(name) AS num FROM student WHERE grade 60 GROUP BY name HAVING num 2 ORDER BY num DESC,name ASC LIMIT 0,2; 复制
执行结果 图1.1
以上这条sql语句基本上概括了单表查询中所有要注意的点那么我们就以这条sql为例来分析一下一条语句的执行流程。
1一条查询的sql语句先执行的是 FROM student 负责把数据库的表文件加载到内存中去如图1.0中所示。mysql数据库在计算机上也是一个进程cpu会给该进程分配一块内存空间在计算机‘服务’中可以看到该进程的状态 图1.2
2WHERE grade 60会把图1.0所示表中的数据进行过滤取出符合条件的记录行生成一张临时表如下图所示。 图1.3
3GROUP BY name会把图1.3的临时表切分成若干临时表分为四个分组我们用下图来表示内存中这个切分的过程。 图1.4) 图1.5) 图1.6) 图1.7)
4SELECT 的执行读取规则分为sql语句中有无GROUP BY两种情况。 1当没有GROUP BY时SELECT 会根据后面的字段名称对内存中的一张临时表整列读取。 2当查询sql中有GROUP BY时会对内存中的若干临时表分别执行SELECT而且只取各临时表中的第一条记录然后再形成新的临时表。这就决定了查询sql使用GROUP BY的场景下SELECT后面跟的一般是参与分组的字段和聚合函数否则查询出的数据要是情况而定。另外聚合函数中的字段可以是表中的任意字段需要注意的是聚合函数会自动忽略空值。 我们还是以本例中的查询sql来分析现在内存中有四张被GROUP BY name切分成的临时表我们分别取名为 tempTable1,tempTable2,tempTable3,tempTable4分别对应图1.4)、图1.5)、图1.6)图1.7)下面写四条”伪SQL”来说明这个查询过程。 SELECT name,COUNT(name) AS num FROM tempTable1;
SELECT name,COUNT(name) AS num FROM tempTable2;
SELECT name,COUNT(name) AS num FROM tempTable3;
SELECT name,COUNT(name) AS num FROM tempTable4; 复制
最后再次成新的临时表如下图 图1.8)
5HAVING num 2对上图所示临时表中的数据再次过滤与WHERE语句不同的是HAVING 用在GROUP BY之后WHERE是对FROM student从数据库表文件加载到内存中的原生数据过滤而HAVING 是对SELECT 语句执行之后的临时表中的数据过滤所以说column AS otherName ,otherName这样的字段在WHERE后不能使用但在HAVING 后可以使用。但HAVING的后使用的字段只能是SELECT 后的字段SELECT后没有的字段HAVING之后不能使用。HAVING num 2语句执行之后生成一张临时表如下 图1.9)
6ORDER BY num DESC,name ASC对以上的临时表按照numname进行排序。 7LIMIT 0,2取排序后的前两个。 转存失败重新上传取消 以上就是一条sql的执行过程同时我们在书写查询sql的时候应当遵守以下顺序。 SELECT XXX FROM XXX WHERE XXX GROUP BY XXX HAVING XXX ORDER BY XXX LIMIT XXX;