SQL語句編寫的那些坑,你踩了幾個?

2021-08-27 05:24:48 字數 1848 閱讀 4764

前言

金九銀十,又到了一年的程式設計師跳槽季,最近總有一些朋友在問資料庫的問題,說面試的時候總是被問到,雖然知道一些,但是要完整的表達還是欠缺的,想了想與其乙個乙個解答,不如做個資料庫優化問題集錦,供所有的有這個方面需要的朋友參考。

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,那麼可能是獲取到別的客戶的資...