在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在使用MyBatis中SQL語句優化總結

華為開發者社區 ? 來源:華為云社區 ? 作者:搬搬磚打打游戲 ? 2021-02-04 15:20 ? 次閱讀

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

1

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

2

SQL優化

約束條件:

數據表增加表的約束條件,防止臟數據。

limit1:

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

拼寫風格:

SQL保留字使用英文大寫,其他使用英文小寫;提高可讀性。

Like:

使用like加通配符,可能使得索引失效,會觸發全表掃描。如果要讓索引生效,那么 LIKE 后面就不能以(%)開頭,比如使用LIKE ‘%太%’或LIKE ‘%太’的時候就會對全表進行掃描。如果使用LIKE ‘太%’,同時檢索的字段進行了索引的時候,則不會進行全表掃描。

對常用于搜索的字段添加索引,能極大增加查詢效率

使用“自連接”優于子查詢。

使用視圖:

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

使用臨時表:

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列的索引。

不建議使用索引的情況:

(1)總數據量很少。 (2)數據重復度大,且不同取值分布均勻,比如性別男女比例各接近50%。

唯一索引/唯一鍵有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,就無法匹配上聯合索引。

連接表:

(1)連接表的數量盡量不要超過 3 張,因為每增加一張表就相當于增加了一次嵌套的循環,數量級增長會非常快,嚴重影響查詢的效率。 (2)對用于連接的字段創建索引,并且該字段在多張表中的類型必須一致。比如 user_id 在 product_comment 表和 user 表中都為 int(11) 類型,而不能一個為 int 另一個為 varchar 類型。

索引失效情況

(1)在 WHERE 子句中,如果在 OR 前的條件列進行了索引,而在 OR 后的條件列沒有進行索引,那么索引會失效。 (2)索引列盡量設置為 NOT NULL 約束。

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

原文標題:學起來!MyBatis中SQL語句優化小結

文章出處:【微信公眾號:華為開發者社區】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    764

    瀏覽量

    44128
  • mybatis
    +關注

    關注

    0

    文章

    60

    瀏覽量

    6713

原文標題:學起來!MyBatis中SQL語句優化小結

文章出處:【微信號:Huawei_Developer,微信公眾號:華為開發者社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    淺談SQL優化小技巧

    存儲緩存的數據; (3)未命中緩存后,MySQL通過關鍵字將SQL語句進行解析,并生成一顆對應的解析樹,MySQL解析器將使用MySQL語法進行驗證和解析。 例如,驗證是否使用了錯
    的頭像 發表于 12-25 09:59 ?414次閱讀

    SSM框架的性能優化技巧 SSM框架RESTful API的實現

    緩存操作。 優化SQL查詢 : SQL查詢是數據庫操作的瓶頸之一。 使用索引來加速查詢,避免全表掃描,盡量使用索引掃描。
    的頭像 發表于 12-17 09:10 ?160次閱讀

    SQL錯誤代碼及解決方案

    SQL數據庫開發和管理,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但通常會在錯誤消息明確指出是語法錯誤。 原因
    的頭像 發表于 11-19 10:21 ?1629次閱讀

    大數據從業者必知必會的Hive SQL調優技巧

    大數據從業者必知必會的Hive SQL調優技巧 摘要 :大數據領域中,Hive SQL被廣泛應用于數據倉庫的數據查詢和分析。然而,由于數據量龐大和復雜的查詢需求,Hive SQL查詢
    的頭像 發表于 09-24 13:30 ?264次閱讀

    QPS提升10倍的sql優化

    當時的sql優化過程 1. 問題背景 大促準備期間發現4c16G的單實例mysql數據庫,每逢流量高峰都會有cpu 100%的問題,集中0點和12點。 但也存在相近大小的流量cpu利用率相差很大的情況
    的頭像 發表于 08-21 11:12 ?353次閱讀
    QPS提升10倍的<b class='flag-5'>sql</b><b class='flag-5'>優化</b>

    IP 地址 SQL 注入攻擊中的作用及防范策略

    SQL 注入是通過將惡意的 SQL 代碼插入到輸入參數,欺騙應用程序執行這些惡意代碼,從而實現對數據庫的非法操作。例如,一個登錄表單
    的頭像 發表于 08-05 17:36 ?310次閱讀

    如何在SQL創建觸發器

    SQL,觸發器(Trigger)是一種特殊類型的存儲過程,它自動執行或激活響應表上的數據修改事件(如INSERT、UPDATE、DELETE等)。觸發器可以用于維護數據庫的完整性、自動化復雜
    的頭像 發表于 07-18 16:01 ?1876次閱讀

    什么是 Flink SQL 解決不了的問題?

    簡介 實時數據開發過程,大家經常會用 Flink SQL 或者 Flink DataStream API 來做數據加工。通常情況下選用2者都能加工出想要的數據,但是總會有 Flink SQ
    的頭像 發表于 07-09 20:50 ?310次閱讀

    性能優化之路總結

    針對老項目,去年做了許多降本增效的事情,其中發現最多的就是接口耗時過長的問題,就集中搞了一次接口性能優化。本文將給小伙伴們分享一下接口優化的通用方案。 ? ? 一、接口優化方案總結 1
    的頭像 發表于 06-17 15:00 ?340次閱讀

    SQL全外連接剖析

    SQL的全外連接是什么? SQL,FULLOUTERJOIN組合左外連接和右外連接的結果,并返回連接子句兩側表
    的頭像 發表于 03-19 18:28 ?2237次閱讀
    <b class='flag-5'>SQL</b>全外連接剖析

    assign語句和always語句的用法

    的用法和功能。 一、Assign語句 Assign語句的定義和語法 Assign語句用于HDL連續賦值,它允許
    的頭像 發表于 02-22 16:24 ?2561次閱讀

    labview 創建mysql 表時 設置時間 怎么mysql是格式是date 而不是datetime?

    選擇 時間日期 但是mysql是date而不是datetime類型 ,除了sql語句創建表 ,怎么能實現創建表數據為datetime類
    發表于 02-04 09:46

    查詢SQLmysql內部是如何執行?

    我們知道mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結果。這條查詢語句 MySQL 內部到底是如何執行的呢?本文跟大家探討一下哈,我們先來看下MySQL基本架構~
    的頭像 發表于 01-22 14:53 ?572次閱讀
    查詢<b class='flag-5'>SQL</b><b class='flag-5'>在</b>mysql內部是如何執行?

    單片機if是什么語句

    單片機的if語句是一種條件語句,用于根據不同的條件執行不同的代碼塊。程序執行過程,條件語句
    的頭像 發表于 01-05 14:04 ?1806次閱讀

    單片機for語句的運用

    單片機的for語句是一種常見的循環控制結構,用于重復執行一段代碼塊,可以簡化程序的編寫和減少代碼量。本文將詳細介紹單片機for語句的運用。 一、for
    的頭像 發表于 01-05 14:02 ?2453次閱讀
    主站蜘蛛池模板: 国产理论视频| 亚洲福利一区二区| 最好看的最新中文字幕2018免费视频| 四虎影院永久免费| v天堂网| 欧美在线性| 天堂国产| 999www成人免费视频| 在线播放视频网站| 午夜精品久久久久蜜桃| 国产成在线人视频免费视频| 国产精品爽爽影院在线| 亚洲va久久久噜噜噜久久男同| 韩国电影天堂网| you ji z z日本人在线观看| 天堂8资源8在线| 日本不卡在线视频高清免费| 欧美网站色| 开心色xxxx| 一级做α爰片久久毛片| 国产精品资源网| 台湾三级毛片| 99久久精品费精品国产| 黄色顶级视频| 911精品国产91久久久久 | 91深夜福利| 国精视频一区二区视频| 6080国产午夜精品| 色五月激情五月| 天天干天天草天天| 自拍偷自拍亚洲精品被多人伦好爽 | 4虎影视国产在线观看精品| jzzjlzz亚洲乱熟在线播放| 日本www色视频成人免费网站| 深夜影院一级毛片| 亚洲国产精品嫩草影院| 亚洲综合五月天欧美| 久久99热久久精品动漫| 国产精品久久久亚洲| 亚洲免费视频播放| 国产网站免费|