sql语句的执行顺序

sql语句的执行顺序为

(1) from
(2) on
(3) join
(4) where
(5) group by, count, sum, avg
(6) having
(7) select
(8) distinct
(9) order by
(10)top

从这个顺序中我们可以看出所有的查询语句都是从from开始执行的,在执行过程中,每个步骤都会生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入表。

1. from后如果存在多张表,那么先取出前两张表,以行数较小的表为基础表,两张表执行笛卡尔积,生成结果表vtb1

2. 将on中的逻辑表达式将应用到vtb1上,以筛选出满足逻辑表达式的行,生成结果表vtb2
一般的sql编辑器都要求join和on搭配使用,因为如果没有on,将生成笛卡尔积。如果你就是想要笛卡尔积作为结果的话,那么on后的表达式可以写1=1这种恒等式,来绕过join,on必须搭配的限制

3. 如果使用的是outer join,那么就需要添加外部行,left outer jion将左表在第二步中过滤的行添加进来,反之将右表在第二步中过滤的行添加进来,生成虚拟表vtb3。
如果from后的表的数量大于2,那么将vtb3作为第一张表,继续重复执行前三步,得到最终的vtb3。

4. 将where中的逻辑表达式将应用到vtb3上,以筛选出满足逻辑表达式的行,生成结果表vtb4

5. 将group by后字段中的唯一的值组合成为一组,得到虚拟表vtb5。之后的count,sum,avg等聚合操作都是针对组的

6. 将having中的逻辑表达式将应用到vtb5上,以筛选出满足逻辑表达式的行,生成vtb6。(having筛选器是唯一应用到已分组数据的筛选器)

7. 将select的列从vtb6中筛选出来。生成vtb7

8. 依据distinct语句,将vtb7中相同的行移除,生成vtb8。如果使用了group by那么就无需使用distinct,因为group by的结果中所有的行都不相同

9. 按照order_by指定的列排序vtb8,生成vc9。排序是很消耗资源的,除非对结果有顺序要求,否则建议不使用order by

10.根据top的列数返回给vt10

 

在网上看到一张图片,可以直观的展示sql语句执行顺序,希望对大家有所帮助

 

 

作者:熔遁丶螺旋手里剑

搭建LAMP环境

1、准备
1、添加3306和80防火墙例外
步骤1:vi /etc/sysconfig/iptables

步骤2:service iptables restart #重启防火墙

2、卸载默认安装的MySQL和Apache
步骤1:分别通过【rpm -qa | grep mysql】和【rpm -qa | grep http】查看已经安装的软件包名称
步骤2:通过【rpm -e 查看的包名 –nodeps】卸载
步骤3:再通过【rpm -qa | grep mysql】和【rpm -qa | grep http】检查是否全部卸载

3、环境目录初始化
# 创建目录
mkdir -p /php/tools
mkdir -p /php/wwwroot
mkdir -p /php/server/php
mkdir -p /php/server/mysql
mkdir -p /php/server/apache
mkdir -p /php/server/data # MySQL数据存放目录
继续阅读“搭建LAMP环境”

网站优化中的八门金“锁”

MySQL中的锁:
从锁定粒度上区分为:表级锁,页级锁,行级锁。

  • 表级锁:
    特点:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度低。
    代表引擎是MyISAM引擎。
    表级锁定分为:表共享读锁(共享锁)与表独占写锁(排他锁)。
    注:
    开销小:指加锁资源消耗较少
    锁定粒度大:指锁的级别,最小的行级锁,最大的表锁。
    锁冲突高:因为针对整个表加锁,除非没有其他人操作否则冲突。
  • 页级锁(不详解)
    特点:优缺点介于表级锁和行级锁之间,粒度为相邻一组数据行。
    代表引擎是BDB引擎。
  • 行级锁:
    特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突概率最低,并发度也最高。
    代表引擎是InnoDB引擎。InnoDB也支持表级锁,默认为行级锁
    行级锁分为:共享锁和排他锁
    注:
    死锁:两个进程同时操作一组数据,相互争夺控制权,造成相互等待若无外力不继续进行一直等待的现象,称之为死锁。
    当两个事务同时执行,一个锁住了主键索引,在等待其他相关索引。另一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。
    行锁与表锁:InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁

继续阅读“网站优化中的八门金“锁””