sql語句效能優化

果果醬_發表於2021-01-03

1.儘量避免全域性掃描

全域性掃描會出降低查詢效率,嚴重的情況會造成死鎖,比如錯誤提示犧牲了一個程式。會造成全域性掃描的查詢語句有:
(1)未使用索引欄位查詢;
(2)在欄位上使用函式、算數運算,儘量將運算放到等號右側;
如 select * from testtable where len(A)=2
(3)左側模糊查詢會導致全表掃描,可以使用右側模糊查詢;
如select * from testtable where A like’%a%’
(4)使用 in or <>進行查詢;
可用用exists代替in,用union代替or
(5)使用空判斷語句;
如select * from testtable where A is null

2.儘量使用索引查詢

使用索引時,將帶有索引的欄位放在條件最前面,如果是聯合索引,按照索引欄位的順序寫。
如表TestTable上有兩個索引,欄位A+欄位B是一個聯合索引,欄位C無索引,則:
select * from testtable where A=’a’ and B=’b’ and C=’c’是可以使用到索引的;
select * from testtable where C=’c’ and A=’a’ and B=’b’ 也是可以使用到索引的,但效率不如上面一條高;
select * from testtable where B=’b’ and A=’a’ and C=’c’ 無法使用索引,效率最低;

3.使用繫結變數

sql語句提交到資料庫時會先生成執行計劃,使用頻度最高的若干條查詢語句會儲存在資料庫執行計劃中,減少下次執行時的解析時間。使用繫結變數的語句雖然引數不同但資料庫會認為是同一條語句,反之發果將引數寫在sql語句中,則每次都會認為是不同的語句。同理,sql語句的編寫儘量規範大小寫,大寫和小寫會認為是兩條不同的語句。
(1)繫結變數的sql寫法:
select * from testtable where username=:p0
使用時username傳入A和B會使用相同的執行計劃
(2)直接傳入引數的寫法:
select * from testtable where username=’A’
select * from testtable where username=’B’
使用時每條sql語句都會生成自己的執行計劃,無法做到執行計劃的複用
(3)大小寫不同無法複用執行計劃
select * from testtable where username=’A’
select * from TestTable where username=’B’
使用時每條sql語句都會生成自己的執行計劃

4.按事物提交

如果一次操作要執行多個sql語句,可以寫在資料庫事物中,事物的優勢是可以多次執行,一次提交,如果有一條執行失敗,可以整體回滾。另外,sql語句的執行時間是很短的,但是提交資料庫寫入磁碟是耗時的,整體提交可以減小寫入磁碟的時間,但不是一次提交的語句越多越好,因為資料庫是分頁寫入的,超過一頁的大小不會再帶來效能的提高,反而提高了資料丟失的風險,所以實際操作時要測試出一個合理的批量提交數。

5.其它

(1)合理建立索引,索引建立在經常使用的欄位上,減少不必要的索引;
(2)合理設計資料庫,如果表資料太多,可以考慮分庫分表;
(3)只查詢需要的欄位,避免select *;
(4)若只含數值資訊的欄位儘量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。
(5)儘可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長欄位儲存空間小,可以節省儲存空間。
chart.js/

相關文章