zoukankan      html  css  js  c++  java
  • sql优化

    1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    比如:select name from user where id >3000;

    我们可以考虑给id建立索引,加快查询速度. 但是应该注意几个问题.

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

    比如  where id is null 或者 id is not null  这样的条件语句,会造成全表扫描.

    (2)  应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

    (3)   应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: 

    select name from user where id  = 10 or  id=20 

    可以这样查询: 

    select name from t where id = 10   union all  select name from t where id =20 

    (4)下面的查询也将导致全表扫描: 

    select id from user where name like '%abc%'   模糊查询 like 后面第一个如果是一个通配符 % 的话,就会全表扫描. 如果是 name  like 'abc%' 不会全表扫描,只会查询索引

     

    (5)应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

    select id from t where substring(name,1,3)='abc'--name以abc开头的id

    应改为: select id from t where name like 'abc%'

    (6)NOT

      我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:

    … where not (status =’VALID’)

    如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:

    … where status <>’INVALID';

    对这个查询,可以改写为不使用NOT:

    select * from employee where salary<3000 or salary>3000;

    虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

    以上都是对索引进行

  • 相关阅读:
    详解Java API之正则表达式
    ios UIWindow 错误使用导致无法接收motionEnded(摇一摇)函数
    ios NSTimer的强引用问题
    ionic 接触的第一个Hybrid项目
    iOS 小经验:UIAnimation空对象导致crash
    iOS GCD 必读推荐,有关于单例使用问题
    ios NSString 转 float的注意
    iOS UIViewController 和 nib 相关的3个方法
    ios delegate 使用注意 assign,weak
    ios 使用autolayout 后button 的frame 无法设置问题!
  • 原文地址:https://www.cnblogs.com/stevehu1231/p/8459894.html
Copyright © 2011-2022 走看看