加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

步步深入MySQL:架构-查询执行流程-SQL解析顺序

发布时间:2018-10-02 16:03:34 所属栏目:MySql教程 来源:AnnsShadoW
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 一、前言 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了。 本文将从MySQL总体架构---查询执行流程---语句执行顺序来探讨一下其中的知识。

这个子句对VT3表中的不同的组进行过滤,只作用于分组后的数据,满足HAVING条件的子句被加入到VT4表中。

  1. mysql> SELECT 
  2.     -> * 
  3.     -> FROM 
  4.     -> table1 AS a 
  5.     -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid 
  6.     -> WHERE 
  7.     -> a. NAME = 'mike' 
  8.     -> GROUP BY 
  9.     -> a.uid 
  10.     -> HAVING 
  11.     -> count(b.oid) < 2; 
  12. +-----+------+------+------+ 
  13. | uid | name | oid  | uid  | 
  14. +-----+------+------+------+ 
  15. | ccc | mike |    6 | ccc  | 
  16. | ddd | mike | NULL | NULL | 
  17. +-----+------+------+------+ 
  18. 2 rows in set (0.00 sec)  

5、SELECT

这个子句对SELECT子句中的元素进行处理,生成VT5表。

(5-J1)计算表达式 计算SELECT 子句中的表达式,生成VT5-J1

(5-J2)DISTINCT

寻找VT5-1中的重复列,并删掉,生成VT5-J2

如果在查询中指定了DISTINCT子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。这张临时表的表结构和上一步产生的虚拟表VT5是一样的,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来除重复数据。

  1. mysql> SELECT 
  2.     -> a.uid, 
  3.     -> count(b.oid) AS total 
  4.     -> FROM 
  5.     -> table1 AS a 
  6.     -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid 
  7.     -> WHERE 
  8.     -> a. NAME = 'mike' 
  9.     -> GROUP BY 
  10.     -> a.uid 
  11.     -> HAVING 
  12.     -> count(b.oid) < 2; 
  13. +-----+-------+ 
  14. | uid | total | 
  15. +-----+-------+ 
  16. | ccc |     1 | 
  17. | ddd |     0 | 
  18. +-----+-------+ 
  19. 2 rows in set (0.00 sec)  

6、ORDER BY

从VT5-J2中的表中,根据ORDER BY 子句的条件对结果进行排序,生成VT6表。

注意:

唯一可使用SELECT中别名的地方;

  1. mysql> SELECT 
  2.     -> a.uid, 
  3.     -> count(b.oid) AS total 
  4.     -> FROM 
  5.     -> table1 AS a 
  6.     -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid 
  7.     -> WHERE 
  8.     -> a. NAME = 'mike' 
  9.     -> GROUP BY 
  10.     -> a.uid 
  11.     -> HAVING 
  12.     -> count(b.oid) < 2 
  13.     -> ORDER BY 
  14.     -> total DESC; 
  15. +-----+-------+ 
  16. | uid | total | 
  17. +-----+-------+ 
  18. | ccc |     1 | 
  19. | ddd |     0 | 
  20. +-----+-------+ 
  21. 2 rows in set (0.00 sec)  

7、LIMIT

LIMIT子句从上一步得到的VT6虚拟表中选出从指定位置开始的指定行数据。

注意:

offset和rows的正负带来的影响;

当偏移量很大时效率是很低的,可以这么做:

采用子查询的方式优化,在子查询里先从索引获取到最大id,然后倒序排,再取N行结果集

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读