如何寫出效能好的sql

2021-04-03 01:19:52 字數 2613 閱讀 4487

開發人員是很少注意sql對資料庫效能影響的重要性的,大多程式設計師都會認為sql是比較簡單的,需要的時候查查手冊就可以了,很少有深究的。

這樣的觀念對大型系統的開發是致命的,需要糾正這樣的觀念。

造成這樣的原因,可能有如下幾種:

1,對資料庫效能的研究,成果不是顯而易見,對程式設計師的成就感激勵不足,因為開發環境中的資料很少,資料庫效能好壞體現不出來,好的sql和差的sql體現不出差別,所以,更多的人選擇的是寫出來就可以了,沒有想到過效能。沒有吃過這方面的虧,沒有深刻的教訓,人總是要有了教訓才會重視,而以教訓作為學習方法其實是很高成本的。

2,程式設計師更重視能寫多少功能,會多少語言,對於一些不是顯而易見和不好衡量的能力是不夠重視的。

今天客戶的一套系統因為一段sql沒有考慮效能問題,導致資料在幾萬條資料的情況下,竟然也出現了巨大的效能開銷,導致系統癱瘓無法使用的狀況,所以,覺得有必要將一些心得寫出來與大家共享。

索引是非常重要的,但是很多人是不重視的。

我總是不厭其煩的向很多開發人員介紹索引的重要性,但是,很多時候都可以從他們臉上看出來那種不以為然,但我還是在不厭其煩的向他們講解,因為索引能否正確使用對系統的效能太重要了。

我覺得幾個重要而簡單的概念應該是必須掌握的:

a.聚集索引和非聚集索引,各應該用在什麼場合

b.什麼樣的語句會使用索引,什麼樣的語句將不使用索引

c.應該在什麼樣的字段上面建立索引

d.復合索引的使用特點

一些具體的規則,如果不能理解,死記住也會獲益

1,經常用來做聯接的字段上面加索引

2,經常用來做條件的字段上面加索引

3,堅決避免在條件中使用否定意義的計算符,如:

select * from table1 where column1 not in (select column2 from table2)

select * from table1 where column1 not exists (select column2 from table2)

select * from table1 where id <> 100

4,聚集索引能對範圍查詢的效能產生巨大的提公升,一定要善加利用,但是如果使用不當,也會帶來巨大的效能損失

如你可以將乙個訂單表的訂單日期加上聚集索引,訂單日期是遞增的,這樣你按照日期範圍查詢時,你將獲得最高的效能

select * from 客戶訂單 where 訂單日期 between '2005-1-1' and '2005-1-31'  --是範圍的查詢

但是你把客戶編號作為聚集索引,將不會帶來重大的效能提公升,反而會有負效果,因為訂單的順序客戶編號是非順序的,這樣由於聚集索引需要重新排列物理磁碟,這樣將會給資料寫入帶來巨大的開銷

5,不要在生成順序不規則的字段上面加聚集索引,應該選擇能夠按照遞增或遞減順序生成資料的字段作為聚集索引的字段

6,堅決避免對條件字段何作為連線的字段進行運算,甚至使用函式,如:

select * from userinfo where firstname + lastname = 'bill gates'

select * from userinfo where dbo.fgetbasicsalary(userinfo.userid) = 2000

select * from table1 inner join table2  on table1.a + table1.b = table2.c

7,建立索引是有必要的,但不是越多越好      

8,可能的話,主鍵多用整型值,用乙個整型欄位做連線,比乙個字串在大資料量的情況下效能會提高很多

9,不要把大數量的內容放到 in ()裡面,如避免如下寫法:

select * from table1 where column1 in (select column2 from table2) --如果此時table2的資料量比較大的情況下,效能將會非常差

其實類似的語句經常可以改寫為連線的方式來實現

10,經常用來order by的字段加上索引,也會有效能的提公升

11,子查詢不要出現太多,大多數能夠使用外連線來替代

select *,

(select z1 from t1 where z2=t2.id) z1,

(select z2 from t1 where z2=t2.id) z2,

(select z3 from t1 where z2=t2.id) z3,

from t2

這段語句肯定不是優化的,會有效能問題的,可以有如下的方式來改寫

select *, t1.z1, t1.z2, t1.z3

from t2 left outer join t1 on t1.z2 = t2.id

12,對於like的使用

推薦:select * from 使用者 where 姓名 like '李%'

不推薦:select * from 使用者 where 姓名 like '%白%'

建議:寫點東西算作拋磚引玉吧,希望能給一些資料庫初學者一些指引和建議吧!

還有就是,如果我們的系統出現了效能的問題,多從軟體的角度來考慮優化,而不是動不動就要求客戶公升級伺服器,硬體的改善對效能的提公升能力是很有限的,提高一倍,兩倍都是很厲害的了,而軟體的優化有時候能起到數十倍,上百倍,甚至更高的效能提公升。

呼籲大家提高對資料效能的重視。

如何寫出高效能SQL

在編寫一條查詢語句的時候,可以依據你要查詢資料表的資料總量,估算一下這條查詢大致需要遍歷多少行資料 如果遍歷行數在百萬以內的,只要不是每秒鐘都要執行幾十上百次的頻繁查詢,可以認為是安全的。遍歷資料行數在幾百萬的,查詢時間最少也要幾秒鐘,你就要仔細考慮有沒有優化的辦法。遍歷行數在千萬左右,是 mysq...

如何寫出高效能SQL語句

1 首先要搞明白什麼叫執行計畫?執行計畫是資料庫根據sql語句和相關表的統計資訊作出的乙個查詢方案,這個方案是由查詢優化器自動分析產生欀如一條sql語句如果用來從乙個10萬條記錄的表中查1條記錄,那查詢優化器會選擇 索引查詢 方式,如果該錶進行了歸檔,當前只剩下5000條記錄了,那查詢優化器就會改變...

SQL查詢優化 如何寫出高效能SQL語句

1.查詢的模糊匹配 盡量避免在乙個複雜查詢裡面使用 like parm1 紅色標識位置的百分號會導致相關列的索引無法使用,最好不要用.解決辦法 其實只需要對該指令碼略做改進,查詢速度便會提高近百倍。改進方法如下 a 修改前台程式 把查詢條件的 商名稱一欄由原來的文字輸入改為下拉列表,使用者模糊輸入 ...