后端程序員必看,13個寫SQL的好建議
SQL是一種數(shù)據(jù)庫的結構化查詢語言,常用的關系型數(shù)據(jù)庫有MySQL,SQL Server,Oracle,Access等。其實就是對存儲在數(shù)據(jù)庫中的數(shù)據(jù)進行查詢等操作的一種語言,如果你有語言學習的基礎,那么學起SQL一定簡單多了。每一個意見和建議都是一筆好財富,建議收藏~
1. 在執(zhí)行刪除或者更新語句,盡量加上limit,它是SQL后悔藥加了limit 主要有這些好處:
- 降低寫錯SQL的代價, 如果不加limit,執(zhí)行的時候一不小心手抖或卡機,數(shù)據(jù)大概就全被刪掉了,刪錯了怎么辦?加了limit 200,一切就不同了,可以通過binlog日志快速恢復。SQL效率可能會更高,你在SQL行中,加了limit 1,如果第一條就命中目標return, 沒有l(wèi)imit的話,還會繼續(xù)執(zhí)行掃描表。
- 避免了長事務,delete執(zhí)行時,如果age加了索引,MySQL會將所有相關的行加寫鎖和間隙鎖,所有執(zhí)行相關行會被鎖住,如果刪除數(shù)量大,直接無法使用相關業(yè)務。當你刪除數(shù)據(jù)量很大時,加 limit限制記錄數(shù),就不容易把cpu打滿。
2. 變更SQL操作先在測試環(huán)境測試,可以避免有語法錯誤就放到生產上。變更SQL操作需要寫明詳細操作步驟,特別是有依賴關系的時候,比如:先修改表結構再增加對應的數(shù)據(jù)。
更換Sql操作有回滾方案,并在上生產前,review對應變更SQL。
3. where后面的字段,留意其數(shù)據(jù)類型的隱式轉換,這樣可以優(yōu)化性能。因為沒加單引號時,是字符串和數(shù)字的比較,類型不匹配,MySQL就會做隱式的類型轉換,把它們轉換為浮點數(shù)再做比較,最后導致索引失效。
4. 在操作生產的數(shù)據(jù)時,修改或者刪除SQL,先寫WHERE查一下,確認后再補充 delete 或 update。
5. 減少不必要的字段返回,可以節(jié)省資源、減少網絡開銷,用到覆蓋索引,減少回表,提高查詢效率。比如運用select <具體字段> 代替 select * 。
6. 數(shù)據(jù)庫和表的字符集盡量統(tǒng)一使用UTF8編碼,可以避免亂碼問題以及不同字符集比較轉換,導致的索引失效問題。若想存儲表情,選擇utf8mb4來進行存儲,請注意它與utf-8的區(qū)別。
7. 盡量使用varchar代替 char。因為首先變長字段存儲空間小,可以節(jié)省存儲空間。
8. 慎用distinct關鍵字,它一般用來過濾重復記錄,以返回不重復的記錄。可以在查詢一個字段或者很少字段的情況下使用時,能帶來優(yōu)化效果。但如果在字段很多的時候使用,會降低查詢效率。
9. SQL命令行修改數(shù)據(jù),養(yǎng)成begin + commit 事務的習慣,這也是一顆SQL后悔藥。
10. 索引命名要規(guī)范,主鍵索引名為 pk_ 字段名;唯一索引名為 uk _字段名 ;普通索引名則為 idx _字段名。比如pk_即primary key;uk_即unique key;idx_即index 的簡稱。
11. where從句中不對列進行函數(shù)轉換和表達式計算,因為索引列上使用mysql的內置函數(shù),索引失效。
12. SQL語句中不IN包含的值不能太多,如果數(shù)值過多,產生的消耗也就較大。MySQL對于IN做了相應的優(yōu)化,即將IN中的常量全部存儲在一個數(shù)組里面,而且這個數(shù)組是排好序的。能用between就不要用in了,或者使用連接來替換。
13. 在適當?shù)臅r候,使用覆蓋索引。它能夠讓你的SQL語句不需要回表,僅訪問索引就能得到全部需要的數(shù)據(jù),大大提升了查詢效率。