1. exists 和in 的区别
当外查询的数据大时,子查询中的记录较少时,用in;先查询子句,然后把外表一条条的与已得到的查询结果匹配,这个时候子查询还会重新运行一遍;
当子查询的记录较多,外查询的数据较少时,用exists;先对外表做loop循环, 把外表的每一行与子表的查询去匹配,相当于两个嵌套的for循环,得到了正确结果之后就返回相当于break;。
exists对外表做loop循环,in把内表外表做hash连接;
2. 尽量少使用* ,*号扫描所有字段
3. 尽量少使用%like,%在最前面会进行全局扫描;
4. having 和 where
having 和where 都是增加查询条件;
having 一般用于对于分组后 的语句查询,where是普通的条件;
where只能对一条数据设置条件,而having是针对的一组;一般是先where过滤然后在使用having;
5. 尽量使用多表连接,避免子查询
6.尽量在where后面 少用!= < >,这样引擎放弃索引 进行全局扫描 ;
避免在where子句中进行函数操作;
7. from where 的子句执行顺序都是从右往左,从下往上,所以
from 将表数据少的放后面,where条件筛选掉数据多的放后面,groupby 从左往右,放在where后面,
having 消耗资源较大,他是在检出所有资源之后再使用的, 所以尽量少用,他是对最后的结果排序,或者对组添加条件;
8.