sql調優

不管何種調優方式,索引是最根本的方法,是一切優化手法的內功,所以一下我們

將討論一些和索引相關的調優方式。在日常工作或交流中,經常會討論一些關於sql調優的問題,然後總結了下,下

面我們主要是從軟件方面進行分析,希望對你有幫助:

        索引可以新建、刪除、重建。

        注:下面介紹的調優手段只是一些常規條件下的優化手法,具體的優化效果是與使用的DBMS以及數據的特點

密切相關的,需要根據具體的情況使用不同的優化手法,否則有可能適得其反。

        ①:創建必要的索引

        在經常需要進行檢索的字段上創建索引,比如要按照姓名進行檢索,那麼就應該在姓名字段上創建索引,如果

經常要按照員工部門和員工崗位級別進行檢索,那麼就應該在員工部門和員工崗位級別這兩個字段上創建索引。創

建索引給檢索帶來的性能提升往往是巨大的,因此在發現檢索速度過慢的時候應該首先想到的就是創建索引。

        ②:使用預編譯查詢

        程序中通常是根據用戶的輸入來動態執行SQL,這時應該儘量使用參數化SQL,這樣不僅可以避免SQL注入漏洞

攻擊,最重要數據庫會對這些參數化SQL進行預編譯,這樣第一次執行的時候DBMS會爲這個SQL語句進行查詢優化

並且執行預編譯,這樣以後再執行這個SQL的時候就直接使用預編譯的結果,這樣可以大大提高執行的速度。

        ③:調整Where字句中的連接順序

        DBMS一般採用自下而上的順序解析where字句,根據這個原理表連接最好寫在其他where條件之前,那些可以

過濾掉最大數量記錄。

        ④:儘量將多條SQL語句壓縮到一句SQL中

        每次執行SQL的時候都要建立網絡連接、進行權限校驗、進行SQL語句的查詢優化、發送執行結果,這個過程

是非常耗時的,因此應該儘量避免過多的執行SQL語句,能夠壓縮到一句SQL執行的語句就不要用多條來執行。

        ⑤:用where字句替換HAVING字句

        避免使用HAVING字句,因爲HAVING只會在檢索出所有記錄之後纔對結果集進行過濾,而where則是在聚合前

刷選記錄,如果能通過where字句限制記錄的數目,那就能減少這方面的開銷。HAVING中的條件一般用於聚合函數

的過濾,除此之外,應該將條件寫在where字句中。

        ⑥:使用表的別名

        當在SQL語句中連接多個表時,請使用表的別名並把別名前綴於每個列名上。這樣就可以減少解析的時間並減

少哪些友列名歧義引起的語法錯誤。

        ⑦:在in和exists中通常情況下使用EXISTS,因爲in不走索引。

        ⑧:避免在索引上使用計算

        在where字句中,如果索引列是計算或者函數的一部分,DBMS的優化器將不會使用索引而使用全表查詢,函數

屬於計算的一種

        效率低:select * from person where salary*12>25000(salary是索引列)

        效率高:select * from person where salary>25000/12(salary是索引列)

        ⑨:用union all替換union

       當SQL語句需要union兩個查詢結果集合時,即使檢索結果中不會有重複的記錄,如果使用union這兩個結果集

同樣會嘗試進行合併,然後在輸出最終結果前進行排序,因此如果可以判斷檢索結果中不會有重複的記錄時候,應

該用union all,這樣效率就會因此得到提高。

       ⑩:避免SQL中出現隱式類型轉換

       當某一張表中的索引字段在作爲where條件的時候,如果進行了隱式類型轉換,則此索引字段將會不被識別,因

爲隱式類型轉換也屬於計算,所以此時DBMS會使用全表掃面。

       最後需要注意的是:防止檢索範圍過寬

       如果DBMS優化器認爲檢索範圍過寬,那麼將放棄索引查找而使用全表掃描。下面幾種可能造成檢索範圍過寬的

情況。

       a、使用is not null或者不等於判斷,可能造成優化器假設匹配的記錄數太多。

       b、使用like運算符的時候,“a%”將會使用索引,而“a%c”和“%a”則會使用全表掃描,因此“a%c”和“%a”不能被有效的評估匹配的數量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章