乾貨 Java高階程式設計之慢SQL問題經驗總結

2021-09-12 09:40:49 字數 1843 閱讀 1415

在遇到慢 sql 情況時,不能簡單的把原因歸結為 sql 編寫問題(雖然這是最常見的因素),實際上導致慢 sql 有很多因素,甚至包括硬體和 mysql 本身的 bug。

1、 導致慢 sql 的原因

在遇到慢 sql 情況時,不能簡單的把原因歸結為 sql 編寫問題(雖然這是最常見的因素),實際上導致慢 sql 有很多因素,甚至包括硬體和 mysql 本身的 bug。根據出現的概率從大到小,羅列如下:

sql編寫問題

鎖業務例項相互幹繞對 io/cpu 資源爭用

伺服器硬體

2、 由 sql 編寫導致的慢 sql 優化

字段型別轉換導致不用索引,如字串型別的不用引號,數字型別的用引號等,這有可能會用不到索引導致全表掃瞄;

mysql 不支援函式轉換,所以字段前面不能加函式,否則這將用不到索引;

不要在字段前面加減運算;

字串比較長的可以考慮索引一部份減少索引檔案大小,提高寫入效率;

like % 在前面用不到索引;

根據聯合索引的第二個及以後的字段單獨查詢用不到索引;

不要使用 select *;

排序請盡量使用公升序 ;

or 的查詢盡量用 union 代替 (innodb);

復合索引高選擇性的字段排在前面;

order by / group by 字段包括在索引當中減少排序,效率會更高。

除了上述索引使用規則外,sql 編寫時還需要特別注意一下幾點:

盡量規避大事務的 sql,大事務的 sql 會影響資料庫的併發效能及主從同步;

分頁語句 limit 的問題;

刪除表所有記錄請用 truncate,不要用 delete;

不讓 mysql 幹多餘的事情,如計算;

輸寫 sql 帶欄位,以防止後面表變更帶來的問題,效能也是比較優的 ( 涉及到資料字典解析,請自行查詢資料);

在 innodb上用 select count(*),因為 innodb 會儲存統計資訊;

慎用 oder by rand()。

3、分析診斷工具

在日常開發工作中,我們可以做一些工作達到預防慢 sql 問題,比如在上線前預先用診斷工具對 sql 進行分析。常用的工具有:

mysqldumpslow

mysql profile

mysql explain

具體使用及分析方法在此就不贅述,網上有豐富的資源可以參考。

4、誤操作、程式 bug 時怎麼辦,解決方案

提出這個問題顯然主要是針對剛開始工作的年輕同行們……實際上誤操作和程式 bug 導致資料誤刪或者混亂的問題並非少見,但是剛入行的開發工作者會比較緊張。乙個成熟的企業往往會有完善的資料管理規範和較豐富的資料恢復方案(初創公司除外),會進行資料備份和資料容災。

當你發現誤操作或程式 bug 導致線上資料被誤刪或誤改動時,一定不能慌亂,應及時與 dba 聯絡,第一時間進行資料恢復(嚴重時直接停止服務),盡可能減少影響和損失。對於重要資料(如資金)的操作,在開發時一定要反覆進行測試,確保沒有問題後再上線。

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導

高階程式設計之 socker程式設計

用來標記網路上的一台電腦 window ifconfiglinux ipconfig1 1 3 1.ipv4 被廣泛使用的 ip協議的版本號是4 當前再用,目前被廣泛應用 ipv4的位址位數為32位 4位位元組 位址有限,幾乎全部耗盡 1 1 3 2.ipv6 ip協議的版本號是6 ipv6的位址位...

Java程式設計之批量處理執行sql語句

在我們實際專案開發過程中,可能有的功能在後台需要執行幾條sql語句甚至需要批量的執行一些sql語句,如果是迴圈一條一條執行,我想大家都知道這樣做的效率特別低,尤其是批量sql時,但是如果我們先迴圈把整個的拼成乙個以 分割開的sql,然後執行這樣的效率提高了不少。string idsarray add...

SQL高階程式設計

sql function 判斷資料庫是否存在 if exists select from sys.databases where name 資料庫名 drop database 資料庫名 判斷表是否存在 if exists select from sysobjects where id object...