数据库学习(四)---SQL优化

  1. 应避免在where子句中使用!=或<>操作符,否则将放弃使用索引而进行全表扫描。
  2. 对查询进行优化,要尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。
  3. 应尽量避免在where子句中对字段进行null值判断,否则将导致放弃使用索引而进行全表扫描,如:select id from t where num is null,最好不要给数据库留null,尽可能的使用not null填充数据库。
  4. 应尽量避免在where子句中使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致放弃使用索引而进行全表扫描,如:select id from t where num = 10 or name = ‘admin’ 可以这样查询:select id from t where num = 10 union all select id from t where name = ‘admin’。
  5. in 和 not in也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2.3);对于连续的数值,能用between就不要用in了,如:select id from t where num between 1 and 3。
    很多时候用exists代替in是一个好的选择,如:select num from t where num in(select num from b),用下面的语句替换,select num from t where exists (select 1 from b where num =t.num)。

    in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

参考博客:https://blog.csdn.net/wqc19920906/article/details/79800374

猜你喜欢

转载自blog.csdn.net/qq_36800800/article/details/106922851