MySql中Sql的执行过程

MySql中Sql的执行过程,第1张

如果查询缓存没有命中,那么SQL请求会进入分析器,分析器是用来分辨SQL语句的执行目的,其执行过程大致分为两步:

表1 语法分析关键字然后再通过语法规则解析,判断输入的SQL 语句是否满足MySQL语法,并且生成图5的语法树。由SQL语句生成的四个单词中,识别出两个关键字,分别是select 和from。根据MySQL的语法Select 和 from之间对应的是fields 字段,下面应该挂接username;在from后面跟随的是Tables字段,其下挂接的是userinfo。

优化器的作用是对SQL进行优化,生成最有的执行方案。如图6所示,前面提到的SQL解析器通过语法分析和语法规则生成了SQL语法树。这个语法树作为优化器的输入,而优化器(黄色的部分)包含了逻辑变换和代价优化两部分的内容。在优化完成以后会生成SQL执行计划作为整个优化过程的输出,交给执行器在存储引擎上执行。

所处的位置如上图所示,这节的重点在优化器中的逻辑变换和代价优化上。

逻辑变换也就是在关系代数基础上进行变换,其目的是为了化简,同时保证SQL变化前后的结果一致,也就是逻辑变化并不会带来结果集的变化。其主要包括以下几个方面:

这样讲概念或许有些抽象,通过图7 来看看逻辑变化如何在SQL中执行的吧。

如图7所示,从上往下共有4个步骤:

1. 针对存在的SQL语句,首先通过“否定消除”,去掉条件判断中的“NOT”。语句由原来的“or”转换成“and”,并且大于小于符号进行变号。蓝色部分为修改前的SQL,红色是修改以后的SQL。2. 等值传递,这一步很好理解分别降”t2.a=9” 和”t2.b=5”分别替换掉SQL中对应的值。3. 接下来就是常量表达式计算,将“5+7”计算得到“12”。4. 最后是常量表达式计算后的化简,将”9<=10”化简为”true”带入到最终的SQL表达式中完成优化。

代价优化是用来确定每个表,根据条件是否应用索引,应用哪个索引和确定多表连接的顺序等问题。为了完成代价优化,需要找到一个代价最小的方案。因此,优化器是通过基于代价的计算方法来决定如何执行查询的(Cost-based Optimization)。简化的过程如下:

这里将配置 *** 作的代价分为MySQL 服务层和MySQL 引擎层,MySQL 服务层主要是定义CPU的代价,而MySQL 引擎层主要定义IO代价。MySQL 5.7 引入了两个系统表mysql.server_cost和mysql.engine_cost来分别配置这两个层的代价。如下:MySQL 服务层代价保存在表server_cost中,其具体内容如下:

由上可以看出创建临时表的代价是很高的,尤其是内部的myisam或innodb临时表。MySQL 引擎层代价保存在表engine_cost中,其具体内容如下:

目前io_block_read_cost和memory_block_read_cost默认值均为1,实际生产中建议酌情调大memory_block_read_cost,特别是对普通硬盘的场景。MySQL会根据SQL查询生成的查询计划中对应的 *** 作从上面两张代价表中查找对应的代价值,并且进行累加形成最终执行SQL计划的代价。再将多种可能的执行计划进行比较,选取最小代价的计划执行。

当分析器生成查询计划,并且经过优化器以后,就到了执行器。执行器会选择执行计划开始执行,但在执行之前会校验请求用户是否拥有查询的权限,如果没有权限,就会返回错误信息,否则将会去调用MySQL引擎层的接口,执行对应的SQL语句并且返回结果。例如SQL:“SELECT * FROM userinfo WHERE username = 'Tom'“假设 “username“ 字段没有设置索引,就会调用存储引擎从第一条开始查,如果碰到了用户名字是” Tom“, 就将结果集返回,没有查找到就查看下一行,重复上一步的 *** 作,直到读完整个表或者找到对应的记录。需要注意SQL语句的执行顺序并不是按照书写顺序来的,顺序的定义会在分析器中做好,一般是按照如下顺序:

如果命中的记录比较多,应用会从MySql Server一批批获取数据

本文从MySQL中SQL语句的执行过程作为切入点,首先介绍了查询请求的执行流程,其中将MySQL的处理分为MySQL Server层和MySQL存储引擎层。通过介绍SQL语句的流转,引出了后面要介绍的5大组件,他们分别是:连接器、查询缓存、分析器、优化器、执行器。后面的内容中对每个组件进行了详细的介绍。连接器,负责身份认证和权限鉴别;查询缓存,将查询的结果集进行缓存,提高查询效率;分析器,对SQL语句执行语法分析和语法规则,生成语法树和执行计划;优化器,包括逻辑变换和代价优化;执行器,在检查用户权限以后对数据进行逐条查询,整个过程遵守SQL语句的执行顺序。

Mysql常用命令详解

Mysql安装目录

数据库目录

/var/lib/mysql/

配置文件

/usr/share/mysql(mysql.server命令及配置文件)

相关命令

/usr/bin(mysqladmin mysqldump等命令)

启动脚本

/etc/init.d/mysql(启动脚本文件mysql的目录)

系统管理

连接MySQL

格式:

mysql -h 主机地址 -u用户名 -p用户密码

例 1:连接到本机上的 MySQL。

hadoop@ubuntu:~$ mysql

-uroot -pmysql

例 2:连接到远程主机上的 MYSQL。

hadoop@ubuntu:~$ mysql -h

127.0.0.1 -uroot -pmysql

修改新密码

在终端输入:mysql -u用户名 -p密码,回车进入Mysql。

>

use mysql

>update user set password=PASSWORD('新密码') where

user='用户名'

>flush privileges#更新权限

>quit#退出

增加新用户

格式:grant select on 数据库.* to

用户名@登录主机 identified by '密码'

举例:

例 1:增加一个用户 test1 密码为

abc,让他可以在任何主机上登录,并对所有数据库有

查询、插入、修改、删除的权限。首先用以 root 用户连入

MySQL,然后键入以下命令:

mysql>grant select,insert,update,delete on *.* to

root@localhost identified by 'mysql'

或者

grant all privileges on *.* to

root@localhost identified by 'mysql'

然后刷新权限设置。

flush privileges

2:如果你不想 root 有密码 *** 作数据库“mydb”里的数据表,可以再打一个命令将密码消掉。

grant

select,insert,update,delete on mydb.* to root@localhost identified by

''

删除用户

hadoop@ubuntu:~$ mysql

-u用户名 -p密码

mysql>delete from user where user='用户名' and

host='localhost'

mysql>flush privileges

//删除用户的数据库

mysql>drop

database dbname

数据库 *** 作

显示所有的数据库

mysql>show databases(注意:最后有个

s)

创建数据库

mysql>create database

test

连接数据库

mysql>use

test

查看当前使用的数据库

mysql>select

database()

当前数据库包含的表信息

mysql>

show tables(注意:最后有个 s)

删除数据库

mysql>drop database

test

表 *** 作

备注: *** 作之前使用“use

<数据库名>”应连接某个数据库。

建表

命令:create

table <表名>(<字段名 1><类型 1>[,..<字段名 n><类型

n>])

例子:

mysql>create table MyClass(

>id int(4) not null

primary key auto_increment,

>name char(20) not null,

>sex int(4)

not null default '0',

>degree double(16,2))

获取表结构

命令: desc 表名,或者show columns from

表名

例子:

mysql>describe MyClass

mysql>desc MyClass

mysql>

show columns from MyClass

删除表

命令:drop table <表名>

例如:删除表名为

MyClass 的表

mysql>drop table MyClass

插入数据

命令:insert into <表名>[( <字段名

1>[,..<字段名 n >])] values ( 值 1 )[, ( 值 n )]

例子:

mysql>insert

into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (2,'Wang',

96.59)

查询表中的数据

查询所有行

mysql>

select * from MyClass

查询前几行数据

例如:查看表 MyClass 中前 2 行数据

mysql>

select * from MyClass order by id limit 0,2

或者

mysql>select * from

MyClass limit 0,2

删除表中数据

命令:delete from 表名 where 表达式

例如:删除表

MyClass 中编号为 1 的记录

mysql>delete from MyClass where id=1

修改表中数据

命令:update 表名 set 字段=新值,... where

条件

mysql>update MyClass set name='Mary' where id=1

在表中增加字段

命令:alter table 表名 add 字段 类型

其他

例如:在表 MyClass 中添加了一个字段 passtest,类型为 int(4),默认值为 0

mysql>alter

table MyClass add passtest int(4) default '0'

更改表名

命令:rename table 原表名 to 新表名

例如:在表

MyClass 名字更改为 YouClass

mysql>rename table MyClass to

YouClass

更新字段内容

命令:update 表名 set

字段名 = 新内容

update 表名 set 字段名 = replace(字段名, '旧内容', '新内容')

例如:文章前面加入 4

个空格

update article set content=concat('', content)

数据库导入导出

从数据库导出数据库文件

使用“mysqldump”命令

首先进入 DOS

界面,然后进行下面 *** 作。

1)导出所有数据库

格式:mysqldump -u [数据库用户名] -p

-A>[备份文件的保存路径]

2)导出数据和数据结构

格式:mysqldump -u [数据库用户名] -p

[要备份的数据库名称]>[备份文件的保存路径]

举例:

例 1:将数据库 mydb 导出到 e:\MySQL\mydb.sql

文件中。

打开开始->运行->输入“cmd”,进入命令行模式。

c:\>mysqldump -h localhost -u

root -p mydb >e:\MySQL\mydb.sql

然后输入密码,等待一会导出就成功了,可以到目标文件中检查是否成功。

2:将数据库 mydb 中的 mytable 导出到 e:\MySQL\mytable.sql 文件中。

c:\>mysqldump -h

localhost -u root -p mydb mytable>e:\MySQL\mytable.sql

例 3:将数据库 mydb

的结构导出到 e:\MySQL\mydb_stru.sql 文件中。

c:\>mysqldump -h localhost -u root -p

mydb --add-drop-table >e:\MySQL\mydb_stru.sql

备注:-h localhost

可以省略,其一般在虚拟主机上用。

3)只导出数据不导出数据结构

格式:

mysqldump -u [数据库用户名] -p -t

[要备份的数据库名称]>[备份文件的保存路径]

4)导出数据库中的Events

格式:mysqldump -u [数据库用户名] -p

-E [数据库用户名]>[备份文件的保存路径]

5)导出数据库中的存储过程和函数

格式:mysqldump -u [数据库用户名]

-p -R [数据库用户名]>[备份文件的保存路径]

从外部文件导入数据库中

1)使用“source”命令

首先进入“mysql”命令控制台,然后创建数据库,然后使用该数据库。最后执行下面 *** 作。

mysql>source

[备份文件的保存路径]

2)使用“<”符号

首先进入“mysql”命令控制台,然后创建数据库,然后退出 MySQL,进入 DOS

界面。最后执行下面 *** 作。

mysql -u root –p <[备份文件的保存路径]

wow单机版一般还需要你安装MySQL的管理工具的,例如navicat之类,里面就有时间查看器啊之类的东西了,用那个就可以执行了。还是去弄一个一键的安装版吧。那个SQL脚本太多了,一个个打你要整死的。

好了分给我吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6201882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存