mysql是过程化的语言吗_MySql语句执行过程(从结构看优化)

逻辑查询步骤

查询操作是关系数据库中使用最为频繁的操作,也是构成其他MySQL语(如DELETE、UPDATE)的基础。查询处理的顺序如下:

(7) SELECT (8) DISTINCT

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) HAVING

(9) ORDER BY

(10) LIMIT

1)FROM:对FROM子句中的左表和右表执行笛卡儿积(Cartesian product),产生虚拟表VT1。

2)ON:对虚拟表VT1应用ON筛选,只有那些符合的行才**入虚拟表VT2中。

3)JOIN:如果指定了OUTER JOIN(如LEFT OUTERJOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表VT2中,产生虚拟表VT3。如果FROM子句包含两个以上表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1)~步骤3),直到处理完所有的表为止。

4)WHERE:对虚拟表VT3应用WHERE过滤条件,只有符合的记录才**入虚拟表VT4中。此时数据还没有分组,所以不能在where中出现对统计的过滤

5)GROUP BY:根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生VT5。在GROUP BY阶段,数据库认为两个NULL值是相等的,因此会将NULL值分到同一个分组中。

6)CUBE|ROLLUP:对表VT5进行CUBE或ROLLUP操作,产生表VT6。

7)HAVING:对虚拟表VT6应用HAVING过滤器,只有符合的记录才**入虚拟表VT7中。count(expr) 会返回expr不为NULL的行数,count(1)、count(*)会返回包括NULL值在内的所有数量

8)SELECT:第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中。

9)DISTINCT:去除重复数据,产生虚拟表VT9。

10)ORDER BY:将虚拟表VT9中的记录按照进行排序操作,产生虚拟表VT10。如果不指定排序,数据并非总是按照主键顺序进行排序的。NULL被视为最小值

11)LIMIT:取出指定行的记录,产生虚拟表VT11,并返回给查询用户。LIMIT n, m的效率是十分低的,一般可以通过在where条件中指定范围来优化 where id> ? limit 10

物理查询

数据库也许并不会完全按照逻辑查询处理的方式来进行查询,MySQL数据库层有Parser和Optimizer两个组件。Parser的工作就是分析SQL语句,而Op-timizer的工作就是对这个SQL语句进行优化,选择一条最优的路径来选取数据,但是必须保证物理查询处理的最终结果和逻辑查询处理是相等的。

Explain语句简介

explain命令是查看查询优化器(Optimizer)是如何执行查询语句的。

explain输出字段

id

select_type

table

type

possible_keys

key

key_len

ref

rows

Extra

id

id值越大优先级越高,越先被执行。id相同时,执行顺序由上至下。

select_type

**:意味着查询不包括子查询和union

PRIMARY:查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY

SUBQUERY: 包含在SELECT列表中的子查询中的SELECT(不在From字句中)

DERIVED:包含在FROM子句的子查询中的SELECT,MySQL会递归执行并将结果放到一个临时表中。

UNION: UNION中的第二个或后面的SELECT语句,UNOIN中的第一个SELECT显示为PRIMARY。

UNION RESULT:用来从UNION的匿名临时表检索结果的SELECT被标记为UNION SELECT。

table

显示这一行数据正在访问哪张表,若在查询中为select起了别名,则显示别名,如果为(x是个数字,可以理解为第几步执行的结果)

type

ALL: 全表扫描,MySQL将遍历全表以找到匹配的行。

index: 跟ALL一样,只是扫描全表时按索引次序进行,与ALL相比主要优点是避免了排序。

range: 有限制的索引扫描,带有BETWEEN 或在WHERE字句中带有>、

ref: 索引查找,查找索引匹配某个单值的所有行(当索引为非唯一性索引时)。

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件。

const、system: const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时,system是const类型的特例,当查询的表只有一行的情况下,使用system。

NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

possible_keys

查询可以使用哪些索引。

keys

MySQL实际采用哪个索引。

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

不损失精确性的情况下,长度越短越好

ref

使用哪个列或常数与key一起从表中选择行。

rows

MySQL估计为了找到所需的行而要读取的行数。

Extra

Using index: 从索引中就可以查询到最终需要的信息,不需要再读取表。

Using temporary: 表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询

Using filesort: MySQL中无法利用索引完成的排序操作称为”文件排序”

原文来自:shanks’s blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值