一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在使用MyBatis中SQL語(yǔ)句優(yōu)化總結(jié)

華為開(kāi)發(fā)者社區(qū) ? 來(lái)源:華為云社區(qū) ? 作者:搬搬磚打打游戲 ? 2021-02-04 15:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

MyBatis 作為一款優(yōu)秀的持久層框架,它支持自定義SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。它免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。還可以通過(guò)簡(jiǎn)單的 XML 或注解來(lái)配置和映射原始類型、接口Java POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫(kù)中的記錄。接下來(lái)為大家?guī)?lái)在日常應(yīng)用的過(guò)程中的一些小技巧。

1

MyBatis總結(jié)

1.MyBatis查詢/更新語(yǔ)句,沒(méi)有找到符合條件的記錄,會(huì)返回什么?返回類型為String的:實(shí)際返回null; 返回類型為對(duì)象的:實(shí)際返回null; 返回類型為列表等集合: 實(shí)際返回空集合[]; 返回類型為Boolean:實(shí)際返回false當(dāng)數(shù)據(jù)庫(kù)語(yǔ)句插入條件不滿足,會(huì)返回false;比如使用dual的SQL語(yǔ)句;

2.mybatis會(huì)拋出哪些常見(jiàn)異常?不是所有的異常,都認(rèn)為程序出異常要報(bào)錯(cuò); 比如用戶重復(fù)收藏商品,可以直接返回成功,這時(shí)候?qū)Α斑`反唯一鍵”異常要特殊處理。

(1) 插入語(yǔ)句DataIntegrityViolationException:違反非空約束、數(shù)據(jù)大小超過(guò)約束 DuplicateKeyException:違反唯一鍵約束 CannotAcquireLockException: for update nowait 超時(shí)

(2)更新語(yǔ)句條件不滿足時(shí),會(huì)返回false 數(shù)據(jù)庫(kù)操作應(yīng)該判斷返回值,比如下面BUG: (3) bug類,表字段找不到等場(chǎng)景MyBatisSystemException BadSqlGrammarException

3.事務(wù)里面套用for update,看上去繞過(guò)了事務(wù)等f(wàn)or update獲取鎖后,select出來(lái)的是最新的數(shù)據(jù) 4.for update是一種行級(jí)鎖,又叫排它鎖一旦用戶對(duì)某個(gè)行施加了行級(jí)加鎖,則該用戶可以查詢也可以更新被加鎖的數(shù)據(jù)行,其它用戶只能查詢但不能更新被加鎖的數(shù)據(jù)行;如果查詢條件帶有主鍵,會(huì)鎖行數(shù)據(jù),如果沒(méi)有,會(huì)鎖表。如果一定要用FOR UPDATE,建議加上NOWAIT 或 for update wait 3

2

SQL優(yōu)化

約束條件:

數(shù)據(jù)表增加表的約束條件,防止臟數(shù)據(jù)。

limit1:

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

拼寫風(fēng)格:

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

Like:

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

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

使用“自連接”優(yōu)于子查詢。

使用視圖:

視圖可以理解成給一個(gè)查詢SQL起個(gè)別名。 只不過(guò)提前經(jīng)過(guò)編譯,視圖不能傳入變量,不保存數(shù)據(jù) 視圖的優(yōu)點(diǎn)是:隔絕數(shù)據(jù)表操作

使用臨時(shí)表:

http://9.IN/EXIST 使用類似兩層for循環(huán),遵循小表驅(qū)動(dòng)大表原則。 如果兩個(gè)表中一個(gè)較小,一個(gè)是大表,則子查詢表大的用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)總數(shù)據(jù)量很少。 (2)數(shù)據(jù)重復(fù)度大,且不同取值分布均勻,比如性別男女比例各接近50%。

唯一索引/唯一鍵有3個(gè)字段時(shí),按其中1個(gè)字段查詢,是否比沒(méi)有索引效率高?

---- 沒(méi)有,這種情況創(chuàng)建唯一鍵,更多的是為了保證數(shù)據(jù)正確性。 (1)唯一索引和唯一鍵的區(qū)別? (2)創(chuàng)建聯(lián)合索引時(shí),我們需要注意創(chuàng)建時(shí)的順序問(wèn)題 因?yàn)槁?lián)合索引 (x, y, z) 和 (z, y, x) 在使用的時(shí)候效率可能會(huì)存在差別。比如剛才舉例的 (x, y, z),如果查詢條件是 WHERE x=1 AND y=2 AND z=3,就可以匹配上聯(lián)合索引;如果查詢條件是 WHERE y=2,就無(wú)法匹配上聯(lián)合索引。

連接表:

(1)連接表的數(shù)量盡量不要超過(guò) 3 張,因?yàn)槊吭黾右粡埍砭拖喈?dāng)于增加了一次嵌套的循環(huán),數(shù)量級(jí)增長(zhǎng)會(huì)非??欤瑖?yán)重影響查詢的效率。 (2)對(duì)用于連接的字段創(chuàng)建索引,并且該字段在多張表中的類型必須一致。比如 user_id 在 product_comment 表和 user 表中都為 int(11) 類型,而不能一個(gè)為 int 另一個(gè)為 varchar 類型。

索引失效情況

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

數(shù)據(jù)表字段,不要用bool類型,用int2 代替 bool類型,增加擴(kuò)展能力

原文標(biāo)題:學(xué)起來(lái)!MyBatis中SQL語(yǔ)句優(yōu)化小結(jié)

文章出處:【微信公眾號(hào):華為開(kāi)發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    782

    瀏覽量

    44952
  • mybatis
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    6892

原文標(biāo)題:學(xué)起來(lái)!MyBatis中SQL語(yǔ)句優(yōu)化小結(jié)

文章出處:【微信號(hào):Huawei_Developer,微信公眾號(hào):華為開(kāi)發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    大促數(shù)據(jù)庫(kù)壓力激增,如何一眼定位 SQL 執(zhí)行來(lái)源?

    你是否曾經(jīng)遇到過(guò)這樣的情況:大促活動(dòng)期間,用戶訪問(wèn)量驟增,數(shù)據(jù)庫(kù)的壓力陡然加大,導(dǎo)致響應(yīng)變慢甚至服務(wù)中斷?更讓人頭疼的是,當(dāng)你試圖快速定位問(wèn)題所在時(shí),卻發(fā)現(xiàn)難以確定究竟是哪個(gè)業(yè)務(wù)邏輯SQL
    的頭像 發(fā)表于 06-10 11:32 ?124次閱讀
    大促數(shù)據(jù)庫(kù)壓力激增,如何一眼定位 <b class='flag-5'>SQL</b> 執(zhí)行來(lái)源?

    如何一眼定位SQL的代碼來(lái)源:一款SQL染色標(biāo)記的簡(jiǎn)易MyBatis插件

    作者:京東物流 郭忠強(qiáng) 導(dǎo)語(yǔ) 本文分析了后端研發(fā)和運(yùn)維日常工作中所面臨的線上SQL定位排查痛點(diǎn),基于姓名貼的靈感,設(shè)計(jì)和開(kāi)發(fā)了一款SQL染色標(biāo)記的MyBatis插件。該插件輕量高效,
    的頭像 發(fā)表于 03-05 11:36 ?380次閱讀
    如何一眼定位<b class='flag-5'>SQL</b>的代碼來(lái)源:一款<b class='flag-5'>SQL</b>染色標(biāo)記的簡(jiǎn)易<b class='flag-5'>MyBatis</b>插件

    Devart: dbForge Compare Bundle for SQL Server—比較SQL數(shù)據(jù)庫(kù)最簡(jiǎn)單、最準(zhǔn)確的方法

    、備份和腳本文件夾的數(shù)據(jù)差異。它可以同步任意數(shù)量數(shù)據(jù)庫(kù)的數(shù)據(jù),只需點(diǎn)擊幾下即可恢復(fù)損壞或丟失的數(shù)據(jù)。 dbForge模式比較 幫助比較數(shù)據(jù)庫(kù)模式,分析差異,并通過(guò)SQL腳本同步差異。它適用于所有
    的頭像 發(fā)表于 01-17 11:35 ?512次閱讀

    dbForge Studio For SQL Server:用于有效開(kāi)發(fā)的最佳SQL Server集成開(kāi)發(fā)環(huán)境

    富的代碼片段集合。 快速數(shù)據(jù)庫(kù)差異比較 比較SQL Server數(shù)據(jù)庫(kù)模式和數(shù)據(jù),分析差異,并安全部署更改。 輕松的數(shù)據(jù)遷移 不同的服務(wù)器之
    的頭像 發(fā)表于 01-16 10:36 ?678次閱讀

    淺談SQL優(yōu)化小技巧

    存儲(chǔ)緩存的數(shù)據(jù); (3)未命中緩存后,MySQL通過(guò)關(guān)鍵字將SQL語(yǔ)句進(jìn)行解析,并生成一顆對(duì)應(yīng)的解析樹(shù),MySQL解析器將使用MySQL語(yǔ)法進(jìn)行驗(yàn)證和解析。 例如,驗(yàn)證是否使用了錯(cuò)
    的頭像 發(fā)表于 12-25 09:59 ?827次閱讀

    SSM框架的性能優(yōu)化技巧 SSM框架RESTful API的實(shí)現(xiàn)

    緩存操作。 優(yōu)化SQL查詢 : SQL查詢是數(shù)據(jù)庫(kù)操作的瓶頸之一。 使用索引來(lái)加速查詢,避免全表掃描,盡量使用索引掃描。
    的頭像 發(fā)表于 12-17 09:10 ?741次閱讀

    深入理解C語(yǔ)言:循環(huán)語(yǔ)句的應(yīng)用與優(yōu)化技巧

    程序設(shè)計(jì),我們常常需要重復(fù)執(zhí)行某一段代碼。為了提高效率和簡(jiǎn)化代碼,循環(huán)語(yǔ)句應(yīng)運(yùn)而生。C語(yǔ)言作為一門經(jīng)典的編程語(yǔ)言,提供了多種循環(huán)控制結(jié)構(gòu),幫助程序員高效地實(shí)現(xiàn)重復(fù)操作。掌握循環(huán)語(yǔ)句
    的頭像 發(fā)表于 12-07 01:11 ?578次閱讀
    深入理解C語(yǔ)言:循環(huán)<b class='flag-5'>語(yǔ)句</b>的應(yīng)用與<b class='flag-5'>優(yōu)化</b>技巧

    SQL錯(cuò)誤代碼及解決方案

    SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)和管理,常見(jiàn)的錯(cuò)誤代碼及其解決方案可以歸納如下: 一、語(yǔ)法錯(cuò)誤(Syntax Errors) 錯(cuò)誤代碼 :無(wú)特定代碼,但通常會(huì)在錯(cuò)誤消息明確指出是語(yǔ)法錯(cuò)誤。 原因
    的頭像 發(fā)表于 11-19 10:21 ?6377次閱讀

    SQL與NoSQL的區(qū)別

    信息技術(shù)領(lǐng)域,數(shù)據(jù)庫(kù)是存儲(chǔ)和管理數(shù)據(jù)的核心組件。隨著互聯(lián)網(wǎng)的發(fā)展和大數(shù)據(jù)時(shí)代的到來(lái),對(duì)數(shù)據(jù)庫(kù)的需求也不斷變化。SQL和NoSQL作為兩種主流的數(shù)據(jù)庫(kù)管理系統(tǒng),各自有著獨(dú)特的優(yōu)勢(shì)和應(yīng)用場(chǎng)
    的頭像 發(fā)表于 11-19 10:15 ?567次閱讀

    大數(shù)據(jù)從業(yè)者必知必會(huì)的Hive SQL調(diào)優(yōu)技巧

    大數(shù)據(jù)從業(yè)者必知必會(huì)的Hive SQL調(diào)優(yōu)技巧 摘要 :大數(shù)據(jù)領(lǐng)域中,Hive SQL被廣泛應(yīng)用于數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)查詢和分析。然而,由于數(shù)據(jù)量龐大和復(fù)雜的查詢需求,Hive SQL查詢
    的頭像 發(fā)表于 09-24 13:30 ?662次閱讀

    QPS提升10倍的sql優(yōu)化

    當(dāng)時(shí)的sql優(yōu)化過(guò)程 1. 問(wèn)題背景 大促準(zhǔn)備期間發(fā)現(xiàn)4c16G的單實(shí)例mysql數(shù)據(jù)庫(kù),每逢流量高峰都會(huì)有cpu 100%的問(wèn)題,集中0點(diǎn)和12點(diǎn)。 但也存在相近大小的流量cpu利用率相差很大的情況
    的頭像 發(fā)表于 08-21 11:12 ?591次閱讀
    QPS提升10倍的<b class='flag-5'>sql</b><b class='flag-5'>優(yōu)化</b>

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

    SQL 注入是通過(guò)將惡意的 SQL 代碼插入到輸入?yún)?shù),欺騙應(yīng)用程序執(zhí)行這些惡意代碼,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的非法操作。例如,一個(gè)登錄表單
    的頭像 發(fā)表于 08-05 17:36 ?602次閱讀

    如何在SQL創(chuàng)建觸發(fā)器

    SQL,觸發(fā)器(Trigger)是一種特殊類型的存儲(chǔ)過(guò)程,它自動(dòng)執(zhí)行或激活響應(yīng)表上的數(shù)據(jù)修改事件(如INSERT、UPDATE、DELETE等)。觸發(fā)器可以用于維護(hù)數(shù)據(jù)庫(kù)的完整性、自動(dòng)化復(fù)雜
    的頭像 發(fā)表于 07-18 16:01 ?3389次閱讀

    什么是 Flink SQL 解決不了的問(wèn)題?

    簡(jiǎn)介 實(shí)時(shí)數(shù)據(jù)開(kāi)發(fā)過(guò)程,大家經(jīng)常會(huì)用 Flink SQL 或者 Flink DataStream API 來(lái)做數(shù)據(jù)加工。通常情況下選用2者都能加工出想要的數(shù)據(jù),但是總會(huì)有 Flink SQ
    的頭像 發(fā)表于 07-09 20:50 ?555次閱讀

    使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制

    一、使用方式 數(shù)據(jù)權(quán)限控制需要對(duì)查詢出的數(shù)據(jù)進(jìn)行篩選,對(duì)業(yè)務(wù)入侵最少的方式就是利用mybatis或者數(shù)據(jù)庫(kù)連接池的切片對(duì)已有業(yè)務(wù)的sql進(jìn)行修改。切片邏輯完成后,僅需要在業(yè)務(wù)中加入少量標(biāo)記代碼
    的頭像 發(fā)表于 07-09 17:26 ?691次閱讀
    使用<b class='flag-5'>mybatis</b>切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制