1. 程式人生 > >SQL語句編寫的那些坑,你踩了幾個?

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

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

首先要強調一點:一個SQL語句要儘量簡單,不要巢狀太多層。有的開發者喜歡用多層巢狀語句,如果你是大學生尚可用來玩一玩,真正到企業級應用了,奉勸你還是用簡單的SQL語句吧。

如何簡化?
簡化目的其一就是避免多次掃描主表,我們來歸納下,在何種情況下會引發掃描主表。
1、不使用臨時表
採用臨時表暫存中間結果,避免程式中多次掃描主表,可以大大減少了阻塞,提高了併發效能。
2、不慎用like的“%”
有的時候會需要進行一些模糊查詢,比如

select id from table where username like ‘%rumo%’

關鍵詞%rumo%,由於rumo前面用到了“%”,所以該查詢採用全表掃描,在一般情況下不要再關鍵詞前加%,除外硬性要求全表掃描。

3、使用 or 來連線條件
在where子句中使用or來連線條件,引擎將放棄索引而採用全表掃描。
建議使用

select id from t where num=10
union all
select id from t where num=20
替代
select id from t where num=10 or num=20
4、使用!=或<>操作符
在where語句中使用!=或<>,引擎將放棄索引而採用全表掃描

5、使用in和not in
在 where 子句中使用 in和not in,引擎將放棄索引而採用全表掃描

6、不使用索引
可以考慮強制查詢使用索引
select * from table force index(PRI) limit 2;(強制使用主鍵)

select * from table force index(rumo_index) limit 2;(強制使用索引”rumo_index”)

select * from table force index(PRI,rumo_index) limit 2;(強制使用索引”PRI和rumo_index”)

7、使用表示式、函式等操作作為查詢條件
除非必要,不要使用

8、大事務操作
除非必要,不要使用,需要提高系統的高併發能力,最近我也一直在研究高併發效能,如有好的想法可以跟我們一起討論。我們的組織扣qun是860170416

9、使用遊標

10、 select * from t ,放棄具體欄位
在使用查詢語句的時候儘量用具體的欄位,不要使用*,避免返回不必要的欄位。
11、使用 char/nchar
儘量用varchar/nvarchar 代替 char/nchar,要知道提高欄位的匹配度可以提高系統性能及節約資源。

12、不使用數字型欄位
有的開發者圖省事,無論什麼欄位統統用字元型,這個習慣可不好,這樣不僅降低了儲存開銷,還會降低查詢和連線的效能。

13、慎用索引
索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率
並不是所有索引對查詢都有效,SQL是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引。

java的那些年微訊號: java1024_
福利送上不謝:
1、關注java的那些年公眾號,每期分享java技術乾貨
2、關注java的那些年能檢視更多歷史乾貨
3、點關注的,今年都脫單