1. 程式人生 > 其它 >mybatis優化及總結

mybatis優化及總結

一、mybatis總結

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

  • 返回型別為String的, 實際返回null;

  • 返回型別為物件的:實際返回null ;

  • 返回型別為列表等集合: 實際返回空集合[];

  • 返回型別為Boolean:實際返回false

  • 當資料庫語句插入條件不滿足,會返回false;比如使用dual的SQL語句;

2.mybatis會丟擲哪些常見異常?

不是所有的異常,都認為程式出異常要報錯,
比如使用者重複收藏商品,可以直接返回成功,這時候對“違反唯一鍵”異常要特殊處理。

  • (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

二、SQL優化

1. 約束條件:資料表增加表的約束條件,防止髒資料。

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

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

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

5.對常用於搜尋的欄位新增索引,能極大增加查詢效率

6.使用“自連線”優於子查詢。

7.使用檢視:

檢視可以理解成給一個查詢SQL起個別名。只不過提前經過編譯,檢視不能傳入變數,不儲存資料
檢視的優點是:隔絕資料表操作

8.使用臨時表:

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 型別。

14.索引失效情況

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

  • (2)索引列儘量設定為 NOT NULL 約束。

15.資料表字段,不要用bool型別,用int2 代替 bool型別,增加擴充套件能力


原文連結:(https://blog.csdn.net/weixin_42502255/article/details/113282576?utm_term=mybatis使用索引查詢&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2)