點擊上方 java項目開發,選擇 設爲星標前端
優質文章,及時送達vue
一、對查詢進行優化,應儘量避免全表掃描java
首先應考慮在 where 及 order by 涉及的列上創建索引。
下面咱們來以一個表中177條數據比較一下,全表掃描與創建索引以後性能的一個比較.react
1.1 全表查詢web
1.2 創建索引查詢
1.3 結論
從這兩種方式查詢數據庫結果看,創建索引以後查詢速度提升了些,如今數據量還不明顯,若是表中有10萬條速度,差別就會很明顯了.spring
二、寫數據語句時儘量減小表的全局掃描
2.1 減小where 字段值null判斷數據庫
SELECT * FROM "tb_real_time_car"where pay_status =null
應該這樣去設置(也就是在沒有值時,咱們在存數據庫時自動默認給個o值,而不是什麼都不寫):
SELECT * FROM "tb_real_time_car"where pay_status =0
2.2 應儘可能避免在 where 子句中使用!=或<>操做符小程序
SELECT * FROM "tb_real_time_car"where pay_status !=null;
//或者
SELECT * FROM "tb_real_time_car"where pay_status <>null;
SELECT * FROM "tb_real_time_car"where pay_status !=nullor enter_time =null;
SELECT * FROM "tb_real_time_car"where pay_status !=nullunion all
SELECT * FROM "tb_real_time_car"where enter_time =null;
SELECT * FROM "tb_real_time_car"where rowed in[1,2,3,4];
//或者
SELECT * FROM "tb_real_time_car"where rowed notin[1,2,3,4];
SELECT * FROM "tb_real_time_car"where rowed between 1and5;
SELECT * FROM "tb_real_time_car"where enter_time like '%2016-09-01%'
2.6 應儘可能避免在 where 子句中對字段進行表達式操做後端
SELECT * FROM "tb_real_time_car"where rowid/4=100;
這樣寫,將致使引擎放棄使用索引而進行全表掃描微信小程序
SELECT * FROM "tb_real_time_car"where rowid =4*100;
2.7 任何地方都不要使用*通配符去查詢全部
SELECT * FROM "tb_real_time_car"where rowid/4=100;
以通配符*去查詢全部數據,這樣作也是很是耗時的,咱們應該須要什麼字段就查詢什麼字段.
SELECT leave_time FROM "tb_real_time_car"where rowid/4=100;
三、不要在條件判斷時進行 算數運算
SELECT * FROM "tb_real_time_car"where rowid/4=100;
SELECT * FROM "tb_real_time_car"where rowed =400;
四、不少時候用 exists 代替 in 是一個好的選擇
SELECT * FROM "tb_real_time_car"where rowed (select rowed from"tb_real");
SELECT * FROM "tb_real_time_car"where exists (select rowed from"tb_real"where rowed = tb_real.rowid);
5 論索引技巧
由於首先變長字段存儲空間小,能夠節省存儲空間,其次對於查詢來講,在一個相對較小的字段內搜索效率顯然要高些。
-
若是表變量包含大量數據,請注意索引很是有限(只有主鍵索引)。 -
在新建臨時表時,若是一次性插入數據量很大,那麼可使用 select into 代替 create table,避免形成大量 log ,以提升速度;若是數據量不大,爲了緩和系統表的資源,應先create table,而後insert。 -
若是使用到了臨時表,在存儲過程的最後務必將全部的臨時表顯式刪除,先 truncate table ,而後 drop table ,這樣能夠避免系統表的較長時間鎖定。 -
避免頻繁建立和刪除臨時表,以減小系統表資源的消耗。
4 儘可能避免使用遊標
-
由於遊標的效率較差,如 果遊標操做的數據超過1萬行,那麼就應該考慮改寫。 -
使用基於遊標的方法或臨時表方法以前,應先尋找基於集的解決方案來解決問題,基於集的方法一般更有效。 -
與臨時表同樣,遊標並非不可以使用。對小型數據集使用 FAST_FORWARD 遊標一般要優於其餘逐行處理方法,尤爲是在必須引用幾個表才能得到所需的數據時。在結果集中包括「合計」的例程一般要比使用遊標執行的速度快。若是開發時間容許,基於遊標的方法和基於集的方法均可 以嘗試一下,看哪種方法的效果更好。
6 數據放回時注意什麼
1.儘可能避免where中包含子查詢;
2.where條件中,過濾量最大的條件放在where子句最後;
3.採用綁定變量有助於提升效率;
4.在索引列上使用計算、改變索引列的類型、在索引列上使用!=將放棄索引;
5.運算符效率:exists高於in高於or,(not exists高於not in);
(這裏指出:in和or都是效率較低的運算,可是in的效率:O(logn)仍然比or的效率:O(n)高的多,尤爲當運算列不是索引的時候尤其明顯)
6.避免在索引列上使用is
null和is not null;
7.使用索引的第一個列;
8.用union-all替代union;
9.like ‘text%’使用索引,但like ‘%text’不使用索引;
- END - 推薦案例
溫暖提示
![]()
爲了方便你們更好的學習,本公衆號常常分享一些完整的單個功能案例代碼給你們去練習, 若是本公衆號沒有你要學習的功能案例,你能夠聯繫小編(微信:xxf960513)提供你的小需求給我,我安排咱們這邊的開發團隊免費幫你完成你的案例。
注意:只能提單個功能的需求不能要求功能太多,好比要求用什麼技術,有幾個頁面,頁面要求怎麼樣?
請長按識別二維碼
想學習更多的java功能案例請關注
Java項目開發
![]()
![]()
若是你以爲這個案例以及咱們的分享思路不錯,對你有幫助,請分享給身邊更多須要學習的朋友。別忘了《留言+點在看》給做者一個鼓勵哦!
本文分享自微信公衆號 - web項目開發(javawebkaifa)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。