SQL基本知识

一、SQL执行循序


SQL单表执行循序

SELECT * FROM  XXX  WHERE  XX = XX

1.先执行FROM的表
2.在执行相应的WHERE条件
3.在执行SELECT查询


SQL多表执行循序
SELECT DISTINCT(XX) FROM XXX(left_table)
[join_type(left/right/all)] JOIN (right_tanle) ON left.XX = right.XX (left/right 两表相等的条件)
WHERE XX = XX
GROUP BY XX(Group by 相应的字段)
WITH{XX}
HAVING XX (having 相应字段)
ORDER BY XX (Order by 相应的字段)
LIMIT XX  (Limit XX 分页)

1.先执行FROM的表
2.执行多表关联的ON条件
3.执行多表关联的JOIN表
4.执行相应的WHERE条件
5.执行GROUP BY分组
6.执行WITH子查询部分
7.执行HAVING 聚合函数
8.执行SELECT查询
9.执行DISTINCT去重

10.执行ORDER BY排序

11.执行LIMIT分页


二、执行过程

不同的数据库执行过程有差异,下面介绍两种主流的数据库(Oracle、Mysql):

  1. 用户提交了一条SQL语句
  2. 数据库按照SQL语句的字面值计算出一个HASH值
  3. 根据HASH值,判断一下在数据库缓冲区中是否存在此SQL的执行计划。
  4. 如果不存在,则需要生成一个执行计划(硬解析过程),然后将结果存入缓冲区。
  5. 如果存在的话,判断是否为相同SQL(同样HASH值的语句,可能字符不相同;即使完全相同,也可能代表不同的语句。这块不展开说了)
  6. 确认是同一条SQL语句,则从缓冲区中取出执行计划。
  7. 将执行计划,交给执行器执行。
  8. 结果返回给客户端。

  1. 客户提交一条语句
  2. 现在查询缓存查看是否存在对应的缓存数据,如有则直接返回(一般有的可能性极小,因此一般建议关闭查询缓存)。
  3. 交给解析器处理,解析器会将提交的语句生成一个解析树。
  4. 预处理器会处理解析树,形成新的解析树。这一阶段存在一些SQL改写的过程。
  5. 改写后的解析树提交给查询优化器。查询优化器生成执行计划。
  6. 执行计划交由执行引擎调用存储引擎接口,完成执行过程。这里要注意,MySQL的Server层和Engine层是分离的。
  7. 最终的结果有执行引擎返回给客户端,如果开启查询缓存的话,则会缓存。


三、执行计划


Mysql执行计划

Explain语法
EXPLAIN  SELECT * FROM  TABLE_NAME ...

变体:
1. EXPLAIN EXTENDED SELECT  * FROM  TABLE_NAME ...
将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句

2. EXPLAIN PARTITIONS SELECT * FROM  TABLE_NAME ...
用于分区表的EXPLAIN


ID
包含一组数字,表示查询中执行select子句或操作表的顺序,id相同执行顺序由上至下;如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行


id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行



Select_type 

表示查询中每个select子句的类型(简单 OR复杂)
 Select_type:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT

a.SIMPLE:查询中不包含子查询或者UNION
b.查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
c.在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
d.在FROM列表中包含的子查询被标记为:DERIVED(衍生)
e.若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在  FROM子句的子查询中,外层SELECT将被标记为:DERIVED
f.从UNION表获取结果的SELECT被标记为:UNION RESULT


Type

表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:
Type:ALL 、index、range、ref、er_ref、const、system、null

由左至右,由最差到最好


a.ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行


b.index:Full Index Scan,index与ALL区别为index类型只遍历索引树


c.range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询


range访问类型的不同形式的索引访问性能差异


d.ref:非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找


f.const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量

system是const类型的特例,当查询的表只有一行的情况下, 使用system


g.NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引


Possible_keys

 
指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用

Key

显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL
TIPS:查询中若使用了覆盖索引,则该索引仅出现在key列表中


Key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度

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


ref

表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

本例中,由key_len可知t1表的idx_col1_col2被充分使用,col1匹配t2表的col1,col2匹配了一个常量,即 ’ac’
 
 
rows
表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
 

Extra

包含不适合在其他列中显示但十分重要的额外信息
 
a.Using index
 
该值表示相应的select操作中使用了覆盖索引(Covering Index)


TIPS:覆盖索引(Covering Index)
 
MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件
 
包含所有满足查询需要的数据的索引称为  覆盖索引(Covering Index)
 
注意:
如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降
 
b.Using where
 
表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),
如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集


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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值