sql基础知识点

一条完整的 SELECT 语句内部的执行顺序是:

  1. FROM 子句组装数据(包括通过 ON 进行连接);
  2. WHERE 子句进行条件筛选;
  3. GROUP BY 分组 ;
  4. 使用聚集函数进行计算;
  5. HAVING 筛选分组;
  6. 计算所有的表达式;
  7. SELECT 的字段;
  8. ORDER BY 排序;
  9. LIMIT 筛选。

哪种情况下应该使用 EXISTS,哪种情况应该用 IN,选择的标准是看能否使用表的索引吗?

索引是个前提,其实选择与否还是要看表的大小。你可以将选择的标准理解为小表驱动大表。在这种方式下效率是最高的。

SELECT * FROM A WHERE cc IN (SELECT cc FROM B);

SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc);

当 A 小于 B 时,用 EXISTS。因为 EXISTS 的实现,相当于外表循环,实现的逻辑类似于:

 for i in A
     for j in B
         if j.cc == i.cc then ...

当 B 小于 A 时用 IN,因为实现的逻辑类似于:

 for i in B
     for j in A
         if j.cc == i.cc then ...

 sql优化知识点

1. 当确定查询结构只有一条时,应使用 LIMIT 1,避免全表查询。

2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:    

select id from t where num is null    

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:    

select id from t where num=0

3. 能导致索引失效,导致全表扫描的其他情况有:

  1. 在 where 子句中使用!=或<>操作符;
  2. 在 where 子句中使用 or 来连接条件;(可以使用union all)
  3. 在 where 子句中使用 in 和 not in;
  4. 在 where 子句中使用 LIKE;
  5. 在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算;

4. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。 

5. 当索引列有大量数据重复时,SQL查询可能不会使用索引。比如,建立在性别字段上的索引就是无意义的。

6. 一个表尽量不要超过6个索引。过多的索引会降低update和insert的效率。

7. 能用数字类型的,就不使用字符串类型的。

8. 多用varchar,少用char

9. 避免频繁创建和删除临时表,以减少系统表资源的消耗。

10. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

11. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

12. 尽量避免大事务操作,提高系统并发能力。

13. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

原文地址:https://www.cnblogs.com/tzzt01/p/13728972.html