oracle索引,主键影响查询速度

要提高查询速度,一般:

1.不需要删除的字段,建主键;有可能要被删除的字段,建索引

2.假如一次提交5W个号码,每个都要和数据库里90W号码进行比较5W个号码中哪些号码是90W号码中的。那么将90W号码建一个表,一个字段就是号码字段,然后把该字段设为主键即可。

update前100条为0,另外一个程序找状态为0的,要提高速度,要将这100条(所有条)的ID建索引。

3.不管对什么字段建的什么索引,该字段只有放在where条件中使用时,索引才生效,假如放到not in或者其他条件中,索引无效。

 

另外,有个语句:

select t1.code,t1.id,t1.content,t1.clid,wg.fnumber,t1.mlevel 
from (select * from t_busi_pre_mx mx
where mx.mainid='000' and mx.sjtdid='00' and mx.stus='1' and mx.stype='1' ) t1
left join T_CL_TD td 
on t1.sjtdid=td.tdid 
left join T_CON_WG wg 
on td.wgid=wg.wgid 
where rownum<=wg.fnumber order by mlevel

 

对于sql中红色字体:(mainid和sjtdid在这里的都是唯一的,但是在表中不一样,不知道怎么说,只想说where后的条件顺序不一样,速度不一样,对某些字段加索引,速度更快)

情况1.(此时mianid未建索引)

where sjtdid='00' and mainid='000'                     耗时900ms


情况2.(此时mianid未建索引)

where mainid='000' and sjtdid='00'                     耗时450ms,快了1倍


情况3.(对mainid建索引,mianid是另外一个表的id)

create index t_busi_pre_mx_idx on t_busi_pre_mx (mainid);
where mainid='000' and sjtdid='00'     耗时33ms,相对情况1,快了30倍

 

4.oracle序列,类似sqlserver自增主键,是数字类型的。使用序列也可以加快查询速度。

---建序列:

CREATE SEQUENCE seq_mxid
    INCREMENT BY 1 -- 每次加几个
    START WITH 1    -- 从1开始计数
    NOMAXVALUE      -- 不设置最大值
    NOCYCLE         -- 一直累加,不循环
;

---使用序列

insert into table(id) values(seq_mxid.nextval);

 

我的实验:

1.clientid(大结果集),sendstatus(小结果集),id(主键)都建了索引,表中数据。

    1>.where..and...and条件中,小结果集在前,大结果集在后:

select * from t_busi_presend_mx where sendstatus='3'  and clientid<>'99407769438752120202' order by id


11行被选择,耗时78.016

    2>.where..and...and条件中,大结果集在前,小结果集在后:

select * from t_busi_presend_mx where  clientid<>'99407769438752120202'  and sendstatus='3'   order by id

 

11行被选择,耗时49.797

事实证明,在查询条件中,要把值的个数(ourgetstat =  0  或 1)少的 ,放在条件的最后,比把这个条件放第一个快。

那么  查询的时候,  where  ...and...and...and
这种条件排序,就应该把结果集最小的放最后,次小的放倒数第二,最大的放第一个?不对,是过滤条件最多的放在离where最近

 

关于索引:

数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
  例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44(也就是在ID这一列找),就可以得知这一行的位置,也就是找到了这一行。可见,索引是用来定位的。
  索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。

索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值