久久一区二区三区精品-久久一区二区明星换脸-久久一区二区精品-久久一区不卡中文字幕-91精品国产爱久久久久久-91精品国产福利尤物免费

sql不為空怎么寫 因為一條SQL,我差

網(wǎng)絡(luò) 分享 時間: 收藏本文

sql不為空怎么寫 因為一條SQL,我差

sql空字符_sql不為空怎么寫_sql為空怎么寫

# 反常的 SQL 語句

我瞇開朦朧的雙眼,才發(fā)現(xiàn)剛才的發(fā)聲來源于我的組長莊哥,看到他在緊張的點開日志系統(tǒng)查看日志,我預感到有什么不妙的事情發(fā)生。

仔細一問才知道,原來就在我瞇眼的期間,線上數(shù)據(jù)庫服務器的 CPU 被打滿,同時觸發(fā)了生產(chǎn)數(shù)據(jù)庫只讀延遲的限定時間并且發(fā)出告警,而且告警的過程持續(xù)了半個小時。

這讓我倒吸了一口涼氣,因為我們組做的系統(tǒng)很多都用的是同一個數(shù)據(jù)庫服務器,日用戶活躍量有好幾十萬,如果服務器崩潰了將會使所有的系統(tǒng)服務都不可用。

于是我們趕緊通過 SQL 日志進行問題查找,最后排查出來是因為一張 SQL 的高量查詢沒有走索引導致。

日志列表顯示,這條 SQL 語句的掃描行數(shù)達到了上百萬,基本就是全表掃描的情況,而且半個小時的時間查詢了達上萬次,每條 SQL 查詢的耗時都在 以上。

我的天啊,難怪服務器會 CPU 打滿,這么一條耗時的 SQL 語句查詢量這么大,數(shù)據(jù)庫的資源當然是直接就崩潰了。

這是當時那條 SQL 的查詢情況:

sql空字符_sql為空怎么寫_sql不為空怎么寫

# 臨時處理

看了這條語句,我又倒吸一口涼氣,這不就是我寫的系統(tǒng)調(diào)用的 SQL 語句嗎?完了,這回逃不掉了,真是人在睡夢里,鍋從天上來。

sql空字符_sql不為空怎么寫_sql為空怎么寫

當然,因為是我自己寫的 SQL,所以我一看就知道這條語句是有問題的。

根據(jù)我的代碼處理,這條 SQL 的調(diào)用還少了個重要的參數(shù) ,這個參數(shù)沒有傳的話是不應該走這條 SQL 查詢的。

在我的設(shè)計里,該參數(shù)是數(shù)據(jù)表里一個聯(lián)合索引的最左側(cè)字段,如果該字段沒有傳值的話,那么索引就不會生效了。

KEY?`idx_userfruitid_type`?(`user_fruit_id`,`task_type`,`receive_start_time`,`receive_end_time`)?USING?BTREE

雖然定位到了 SQL 語句,但是線上的問題刻不容緩,總不可能找出 Bug 改完再上線吧。

所以,我們只能做了一個臨時處理,就是在原來的表上多加了一個聯(lián)合索引,其實就是去掉了 字段,讓這些高量的查詢都能走新的索引。

就像下面這樣:

KEY?`idx_task_type_receive_start_time`?(`task_type`,`receive_start_time`,`receive_end_time`,`created_time`)?USING?BTREE

加上索引后,SQL 的掃描行數(shù)就大幅度的降低了,重啟實例后就又能正常運行了。

# 最左匹配原則

那么為什么最左側(cè)的字段沒傳索引就不生效了,這是因為 的聯(lián)合索引是基于“最左匹配原則”匹配的。

我們都知道,索引的底層是 B+ 樹結(jié)構(gòu),聯(lián)合索引的結(jié)構(gòu)也是 B+ 樹,只不過鍵值數(shù)量不是一個,而是多個,構(gòu)建一顆 B+ 樹只能根據(jù)一個值來構(gòu)建,因此數(shù)據(jù)庫依據(jù)聯(lián)合索引最左的字段來構(gòu)建 B+ 樹。

例如我們用兩個字段(name,age)這個聯(lián)合索引來分析:

sql空字符_sql不為空怎么寫_sql為空怎么寫

圖片來源于林曉斌老師的《 實戰(zhàn) 45 講》課程

當我們在 條件中查找 name 為“張三”的所有記錄的時候,可以快速定位到 ID4,并且查出所有包含“張三”的記錄。

而如果要查找“張三,10”這一條特定的數(shù)據(jù),就可以用 name = "張三" and age = 10獲取。

因為聯(lián)合索引的鍵值對是兩個,所以只要前面的 name 確定的情況下就可以進一步定位到具體的 age 記錄。

但是如果你的查詢條件只有 age 的話,那么索引就不會生效,因為沒有匹配最左邊的字段,后面所有的索引字段都不會生效。

# 找出 Bug

雖然臨時做了處理,但問題并不算解決,很明顯是系統(tǒng)出現(xiàn)了 Bug 才會有走這樣的查詢條件。

因為是我自己寫的代碼,所以知道是哪條 SQL 后我就馬上定位到了代碼里的具體方法,后來才發(fā)現(xiàn)是因為我對 字段的判空處理不生效所致。

因為該字段是從調(diào)用方傳過來的,所以我在方法參數(shù)里對該字段做了非空限制的注解,也就是 包下的 @:

public class GardenUserTaskListReq implements Serializable {
private static final long serialVersionUID = -9161295541482297498L;
@ApiModelProperty(notes = "水果id") @NotNull(message = "水果id不能為空") private Long userFruitId; /**以下省略*/ .....................}

雖然加上該注解來做非空校驗,但我卻沒有在參數(shù)加上另一個注解 @。

該注解如果沒加上的話,那么調(diào)用 包下的校驗規(guī)則就都不生效,正確的寫法是在 層方法的參數(shù)前面加上注解:

sql為空怎么寫_sql空字符_sql不為空怎么寫

除此之外,因為 這個字段是另一張表的主鍵,我在代碼里也沒有對這張表是否存在這個 id 做查詢判斷。

這樣一來,無論調(diào)用方傳什么值過來都會直接觸發(fā) SQL 查詢,并且在不跑索引的情況下直接走全表掃描。

sql空字符_sql不為空怎么寫_sql為空怎么寫

不得不說,這真是個低級錯誤,說真的,我對這個原因真是感到嘀笑皆非,再怎么說也工作幾年了,怎么還犯一些新手級別的錯誤呢,這臉打得真是讓我相當慚愧。

# 總結(jié)

雖然是低級錯誤,但造成的后果也算挺嚴重了,這次事件也讓我更加的警醒,在以后的開發(fā)工作中必須要遵守該有的原則,大概有這么幾點:

千里之堤毀于蟻穴,有時一個小 Bug 很容易就引發(fā)整個系統(tǒng)的崩盤,這一次的問題也讓我更加深刻的認識到了 代碼的重要性,不管業(yè)務開發(fā)的工作量有多麻煩,這一步操作絕對不能忽視。

相關(guān)專題 索引sql數(shù)據(jù)庫
信息流廣告 周易 易經(jīng) 代理招生 二手車 網(wǎng)絡(luò)營銷 旅游攻略 非物質(zhì)文化遺產(chǎn) 查字典 社區(qū)團購 精雕圖 戲曲下載 抖音代運營 易學網(wǎng) 互聯(lián)網(wǎng)資訊 成語 成語故事 詩詞 工商注冊 注冊公司 抖音帶貨 云南旅游網(wǎng) 網(wǎng)絡(luò)游戲 代理記賬 短視頻運營 在線題庫 國學網(wǎng) 知識產(chǎn)權(quán) 抖音運營 雕龍客 雕塑 奇石 散文 自學教程 常用文書 河北生活網(wǎng) 好書推薦 游戲攻略 心理測試 石家莊人才網(wǎng) 考研真題 漢語知識 心理咨詢 手游安卓版下載 興趣愛好 網(wǎng)絡(luò)知識 十大品牌排行榜 商標交易 單機游戲下載 短視頻代運營 寶寶起名 范文網(wǎng) 電商設(shè)計 免費發(fā)布信息 服裝服飾 律師咨詢 搜救犬 Chat GPT中文版 經(jīng)典范文 優(yōu)質(zhì)范文 工作總結(jié) 二手車估價 實用范文 古詩詞 衡水人才網(wǎng) 石家莊點痣 養(yǎng)花 名酒回收 石家莊代理記賬 女士發(fā)型 搜搜作文 石家莊人才網(wǎng) 鋼琴入門指法教程 詞典 圍棋 chatGPT 讀后感 玄機派 企業(yè)服務 法律咨詢 chatGPT國內(nèi)版 chatGPT官網(wǎng) 勵志名言 河北代理記賬公司 文玩 語料庫 游戲推薦 男士發(fā)型 高考作文 PS修圖 兒童文學 買車咨詢 工作計劃 禮品廠 舟舟培訓 IT教程 手機游戲推薦排行榜 暖通,電地暖, 女性健康 苗木供應 ps素材庫 短視頻培訓 優(yōu)秀個人博客 包裝網(wǎng) 創(chuàng)業(yè)賺錢 養(yǎng)生 民間借貸律師 綠色軟件 安卓手機游戲 手機軟件下載 手機游戲下載 單機游戲大全 免費軟件下載 石家莊論壇 網(wǎng)賺 手游下載 游戲盒子 職業(yè)培訓 資格考試 成語大全 英語培訓 藝術(shù)培訓 少兒培訓 苗木網(wǎng) 雕塑網(wǎng) 好玩的手機游戲推薦 漢語詞典 中國機械網(wǎng) 美文欣賞 紅樓夢 道德經(jīng) 標準件 電地暖 網(wǎng)站轉(zhuǎn)讓 鮮花 書包網(wǎng) 英語培訓機構(gòu) 電商運營
主站蜘蛛池模板: 337p粉嫩日本亚洲大胆艺术照 | 国产一级毛片午夜 | 欧美在线一区二区三区 | 日本伊人精品一区二区三区 | 久久骚| 真实国产普通话对白乱子子伦视频 | 免费在线成人网 | 手机毛片在线观看 | 国产a∨一区二区三区香蕉小说 | 日韩亚洲一区中文字幕 | 久久免费手机视频 | 男人干女人逼 | 高清国产一级精品毛片基地 | 九九九九九九 | 又摸又揉又黄又爽的视频 | 亚洲国产成人久久精品影视 | 男人都懂的网址在线看片 | 国产成人精品日本亚洲网站 | 久久精品高清视频 | 日韩欧美国产精品第一页不卡 | 91年精品国产福利线观看久久 | 日韩在线视频免费不卡一区 | 国产免费爱在线观看视频 | a毛片免费全部在线播放毛 a毛片免费视频 | 九九视频免费观看 | 久久亚洲高清观看 | 99精品国产综合久久久久 | 免费a视频在线观看 | 精品日本亚洲一区二区三区 | 欧美成人影院在线观看三级 | 日韩在线高清 | se视频在线观看 | 国产成人一区二区三区 | 高清国产一级精品毛片基地 | 91精品国产综合久久久久久 | 久久久精品久久视频只有精品 | 手机看片国产 | 国产网站免费 | 亚洲国产精品线在线观看 | 网站免费满18成年在线观看 | 中文精品视频一区二区在线观看 |