MyBatis中SQL語句優化小結

摘要:MyBatis 做爲一款優秀的持久層框架,它支持自定義SQL、存儲過程以及高級映射。

MyBatis 做爲一款優秀的持久層框架,它支持自定義SQL、存儲過程以及高級映射。它免除了幾乎全部的 JDBC 代碼以及設置參數和獲取結果集的工做。還能夠經過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。接下來爲你們帶來在平常應用的過程當中的一些小技巧。數據庫

1、MyBatis總結

1.MyBatis查詢/更新語句,沒有找到符合條件的記錄,會返回什麼?mybatis

返回類型爲String的, 實際返回null;框架

返回類型爲對象的:實際返回null ;優化

返回類型爲列表等集合: 實際返回空集合[];ui

返回類型爲Boolean:實際返回falseurl

當數據庫語句插入條件不知足,會返回false;好比使用dual的SQL語句;spa

2.mybatis會拋出哪些常見異常?.net

不是全部的異常,都認爲程序出異常要報錯,code

好比用戶重複收藏商品,能夠直接返回成功,這時候對「違反惟一鍵」異常要特殊處理。對象

(1) 插入語句

DataIntegrityViolationException: 違反非空約束、數據大小超過約束

DuplicateKeyException:違反惟一鍵約束

CannotAcquireLockException: for update nowait 超時

(2)更新語句

條件不知足時,會返回false

數據庫操做應該判斷返回值,好比下面BUG:

(3) bug類,表字段找不到等場景

MyBatisSystemException

BadSqlGrammarException

3.事務裏面套用for update,看上去繞過了事務

等for update獲取鎖後,select出來的是最新的數據

4.for update是一種行級鎖,又叫排它鎖,

一旦用戶對某個行施加了行級加鎖,則該用戶能夠查詢也能夠更新被加鎖的數據行,其它用戶只能查詢但不能更新被加鎖的數據行;

若是查詢條件帶有主鍵,會鎖行數據,若是沒有,會鎖表。

若是必定要用FOR UPDATE,建議加上NOWAIT 或 for update wait 3

2、SQL優化

1. 約束條件:數據表增長表的約束條件,防止髒數據。

2. limit1:若是咱們知道返回結果只有 1 條,就可使用LIMIT 1,告訴 SELECT 語句只須要返回一條記錄便可。這樣的好處就是 SELECT 不須要掃描完整的表,只須要檢索到一條符合條件的記錄便可返回。

3.拼寫風格:SQL保留字使用英文大寫,其餘使用英文小寫;提升可讀性。

4.Like:使用like加通配符,可能使得索引失效,會觸發全表掃描。若是要讓索引生效,那麼 LIKE 後面就不能以(%)開頭,好比使用LIKE '%太%'或LIKE '%太'的時候就會對全表進行掃描。若是使用LIKE '太%',同時檢索的字段進行了索引的時候,則不會進行全表掃描。

5.對經常使用於搜索的字段添加索引,能極大增長查詢效率

6.使用「自鏈接」優於子查詢。

7.使用視圖:

視圖能夠理解成給一個查詢SQL起個別名。

只不過提早通過編譯,視圖不能傳入變量,不保存數據

視圖的優勢是:隔絕數據表操做

8.使用臨時表:

http://9.IN/EXIST 使用相似兩層for循環,遵循小表驅動大表原則。

若是兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)

select * from A where cc in (select cc from B) ;//  效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc) ;// 效率高,用到了B表上cc列的索引。

10.不建議使用索引的狀況:

(1)總數據量不多。

(2)數據重複度大,且不一樣取值分佈均勻,好比性別男女比例各接近50%。

11.惟一索引/惟一鍵有3個字段時,按其中1個字段查詢,是否比沒有索引效率高?

---- 沒有,這種狀況建立惟一鍵,更多的是爲了保證數據正確性。

(1)惟一索引和惟一鍵的區別?

(2)建立聯合索引時,咱們須要注意建立時的順序問題,由於聯合索引 (x, y, z) 和 (z, y, x) 在使用的時候效率可能會存在差異。好比剛纔舉例的 (x, y, z),若是查詢條件是 WHERE x=1 AND y=2 AND z=3,就能夠匹配上聯合索引;若是查詢條件是 WHERE y=2,就沒法匹配上聯合索引。

12.鏈接表:

(1)鏈接表的數量儘可能不要超過 3 張,由於每增長一張表就至關於增長了一次嵌套的循環,數量級增加會很是快,嚴重影響查詢的效率。

(2)對用於鏈接的字段建立索引,而且該字段在多張表中的類型必須一致。好比 user_id 在 product_comment 表和 user 表中都爲 int(11) 類型,而不能一個爲 int 另外一個爲 varchar 類型。

13.索引失效狀況

(1)在 WHERE 子句中,若是在 OR 前的條件列進行了索引,而在 OR 後的條件列沒有進行索引,那麼索引會失效。

(2)索引列儘可能設置爲 NOT NULL 約束。

14.數據表字段,不要用bool類型,用int2 代替 bool類型,增長擴展能力

本文分享自華爲雲社區《mybatis使用及SQL語句優化小結》,原文做者:搬搬磚打打遊戲 。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索