首頁  >  文章  >  資料庫  >  SQL語句效率問題的幾點總結

SQL語句效率問題的幾點總結

巴扎黑
巴扎黑原創
2016-12-20 13:44:041076瀏覽

1. SQL最佳化的原則是:

  將一次操作需要讀取的BLOCK數減到最低,即在最短的時間達到最大的資料吞吐量。
  調整不良SQL通常可以從以下幾點切入:   
  檢查不良的SQL,考慮其寫法是否還有可最佳化內容   
  檢查子查詢   使用   
  考慮資料庫的最佳化器

2. 避免出現SELECT   *   FROM   table     語句,且要明確找出的欄位。     

    
3. 在一個SQL語句中,如果一個where條件過濾的資料庫記錄越多,

    定位越準確,則該where條件越應前移。   

    
4. 查詢時盡可能使用索引覆蓋。即對SELECT的欄位建立複合索引,

    這樣查詢時只進行索引掃描,不讀取資料區塊。

5. 判斷有無符合條件的記錄時建議不要用SELECT   COUNT   (*)和select   top   1   語句。   

    
6. 使用內層限定原則,在拼字SQL語句時,將查詢條件分解、分類,

    並盡量在SQL語句的最裡層進行限定,以減少資料的處理量。   

    
7. 應絕對避免在order   by子句中使用表達式。   
    
8. 若需要從關聯表讀數據,因此關聯的表一般不要超過7個。   
    
9. 小心使用   IN   與   OR,且需要注意In集合中的資料量。建議集合中的資料不超過200個。   
    
10.    以      來代替,且>以>=代替,    
11. 查詢時盡量減少多餘資料的讀取包括多餘的列與多餘的行。
    
12. 複合索引要注意,例如在建立複合索引時列的順序是F1,F2,F3,

     則在where或order   by子句中這些字段出現的順序順序與索引一致,

    且必須包含第  一列。只能是F1或F1,F2或F1,F2,F3。否則不會用到該索引。 

13. 多表關聯查詢時,寫法必須遵循以下原則,這樣做有利於建立索引,提高查詢效率。

     格式如下

     select   sum(table1.je)   from   table1       

     table3     table3   where   (table1的等值條件(=))   and   (table1的非等值條件) 

table1的關聯條件)   and (table2的等值條件)   and   (table2的非等值條件)    

     and (table3與table2的相關條件)   and   (table3的等值條件關聯條件。   

     注意:關於多表查詢時from     後表的出現順序對效率的影響仍有待研究。   

    
14. 子查詢問題。對於能用連接方式或視圖方式實現的功能,不要用子查詢。

     例如:select   name    from   customer   where  

     customer_ money>1000)。

     應使用下列語句取代:select   name   from   customer  

    inner   join     where   order.money>100。   

    

15. 在WHERE   子句中,避免對列的四則運算,

     特別是where   條件的左邊,嚴禁使用運算與函數對列進行處理。

     例如有些地方   substring   可用like取代。   
    
16. 如果在語句中有not   in(in)操作,

     應考慮使用not   exists(exists)來重寫,最好的方法是使用外部連接。
      
17. 對一個業務流程的處理,應該使事物的開始與結束之間的時間間隔越短越好,

     原則上做到,資料庫寫入作業在後面完成,避免交叉。

18. 小心不要對過多的列使用列函數和order   by,group   by等,並謹慎使用disti軟體開發t。   
    
19. 使用union   all   取代   union,且資料庫執行union操作,

        

     當已知的業務邏輯決定query   A和query   B不會重複記錄時,


     應以union   all取代效率。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn