要提高查詢速度,一般:
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 mxwhere mx.mainid='000' and mx.sjtdid='00' and mx.stus='1' and mx.stype='1' ) t1left 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這一列找),就可以得知這一行的位置,也就是找到了這一行。可見,索引是用來定位的。
索引分為聚簇索引和非聚簇索引兩種,聚簇索引 是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。
當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改操作遠遠多於檢索操作時,不應該建立索引。
索引需要佔物理空間,除了資料表占資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。
當對錶中的資料進行增加、刪除和修改的時候,索引也要動態維護,這樣就降低了資料的維護速度。