MySQL from 子查询解决where性能问题

我们在where子句中书写的子查询都属于相关子查询,因为MySQL默认情况下关闭了缓存,所以我们查询出来的数据并不会被缓存起来。在这种情况下你使用子查询是非常不恰当的,那么相关子查询就是要循环执行多次的子查询,如果说数据表的记录越多,那么子查询执行的效率也就越低了。为什么这么说?同学们请你看下面的

## 公司月薪高于ALLEN 有哪些同事?
select *
from emp
where sal > (
    select sal
    from emp
    where ename = 'ALLEN'
);


每次筛选一条员工记录的时候,那么就会执行一次子查询,如果说我们的员工表里边有1万条数据,那么子查询就要执行1万遍。如果说员工表里面有10万条数据,这个子查询就要实行10万遍,这真是太恐怖了,所以查询的效率太低,我们真得注意了,不能这么去写SQL语句,那么有什么办法可以解决这个问题?

## from 子查询
select empno, ename, emp.sal
from emp
         join (select sal
               from emp
               where ename = 'ALLEN') t
              on emp.sal > t.sal;

那么from查询就是把查询放在from子句里边的一种写法,比如说在这个例子里,那么我把子查询放在from剧里面了,先去查询一下ALLEN这个人的底细是多少钱,然后把查询的结果集当做一张表跟员工表做表连接,Nama条件是其他员工的底薪比ALLEN这个人的底薪高

解,为什么子查询拿到from子句里边就不是相关子查询了?,查询效率到底是怎么提高的?

首先你要弄明白from子句里边的内容并不是循环执行的,那么from子句首先是用来确定数据的来源,也就是说from子句在查询语句中最先被执行,而且只会执行一次,那么你把子查询写到from子句里边,当然就不会是相关子查询了,所以查询的效率也就提升了。所以各位同学请记好,替代where子查询的最好办法,那就是写成from查询。