前言
金九銀十,又到了一年的程式設計師跳槽季,最近總有一些朋友在問資料庫的問題,說面試的時候總是被問到,雖然知道一些,但是要完整的表達還是欠缺的,想了想與其乙個乙個解答,不如做個資料庫優化問題集錦,供所有的有這個方面需要的朋友參考。
sql語句編寫的那些坑,你踩了幾個?
一些sql優化建議
首先要強調一點:乙個sql語句要盡量簡單,不要巢狀太多層。有的開發者喜歡用多層巢狀語句,如果你是大學生尚可用來玩一玩,真正到企業級應用了,奉勸你還是用簡單的sql語句吧。
如何簡化?
簡化目的其一就是避免多次掃瞄主表,我們來歸納下,在何種情況下會引發掃瞄主表。
1、不使用臨時表
採用臨時表暫存中間結果,避免程式中多次掃瞄主表,可以大大減少了阻塞,提高了併發效能。
2、不慎用like的「%」
有的時候會需要進行一些模糊查詢,比如
selectidfromtablewhereusernamelike『%rumo%』
3、使用or來連線條件
在where子句中使用or來連線條件,引擎將放棄索引而採用全表掃瞄。
建議使用
selectidfromtwherenum=10
unionall
selectidfromtwherenum=20
替代selectidfromtwherenum=10ornum=20
4、使用!=或操作符
在where語句中使用!=或,引擎將放棄索引而採用全表掃瞄
5、使用in和notin
在where子句中使用in和notin,引擎將放棄索引而採用全表掃瞄
6、不使用索引
可以考慮強制查詢使用索引
select*fromtableforceindex(pri)limit2;(強制使用主鍵)
select*fromtableforceindex(rumo_index)limit2;(強制使用索引rumo_index)
select*fromtableforceindex(pri,rumo_index)limit2;(強制使用索引pri和rumo_index)
7、使用表示式、函式等操作作為查詢條件
除非必要,不要使用
8、大事務操作
除非必要,不要使用,需要提高系統的高併發能力,最近我也一直在研究高併發效能,如有好的想法可以跟我們一起討論。我們的組織扣qun是860170416
sql語句編寫的那些坑,你踩了幾個?
9、使用游標
10、select*fromt,放棄具體字段
在使用查詢語句的時候盡量用具體的字段,不要使用*,避免返回不必要的字段。
11、使用char/nchar
盡量用varchar/nvarchar代替char/nchar,要知道提高欄位的匹配度可以提高系統效能及節約資源。
12、不使用數字型字段
有的開發者圖省事,無論什麼字段統統用字元型,這個習慣可不好,這樣不僅降低了儲存開銷,還會降低查詢和連線的效能。
13、慎用索引
索引並不是越多越好,索引固然可以提高相應的select的效率,但同時也降低了insert及update的效率
並不是所有索引對查詢都有效,sql是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,sql查詢可能不會去利用索引。
還有最後一句話與君共勉:
SQL語句編寫的那些坑,你踩了幾個?
前言 金九銀十,又到了一年的程式設計師跳槽季,最近總有一些朋友在問資料庫的問題,說面試的時候總是被問到,雖然知道一些,但是要完整的表達還是欠缺的,想了想與其乙個乙個解答,不如做個資料庫優化問題集錦,供所有的有這個方面需要的朋友參考。一些sql優化建議 首先要強調一點 乙個sql語句要盡量簡單,不要巢...
oracle踩的那些坑
1.oracle日誌滿溢 公司測試環境忽然莫名其妙用不了了,檢查後發現是oracle監聽關閉了,嘗試啟動監聽,很慢,等待很久 反覆啟動後才啟動成功。然而成功後又提示連線超時。漫長的檢查後,發現是oracle的日誌檔案沒有清理,導致日誌檔案滿溢,oracle監聽自動關閉 卡頓。解決方法很簡單,直接關閉...
那些年我們踩的坑,依然有人在踩坑
舉個栗子客戶資訊是怎麼不安全的 在查詢使用者資訊的時候使用sql select top 1 from addr where id 位址id在正常情況下,這個是肯定是沒有問題的,使用者的位址id是唯一。但是呢,如果在web 下,使用get請求去獲取,使用者隨便修改乙個id,那麼可能是獲取到別的客戶的資...