資料庫SQL調優的幾種方式是什麼

青灯夜游
發布: 2023-01-05 16:10:57
原創
38298 人瀏覽過

方式:1、建立索引時,盡量避免全表掃描;2、避免在索引上使用計算;3、盡量使用參數化SQL;4、盡量將多條SQL語句壓縮到一句SQL中;5、用where字句取代HAVING字句;6、連接多個表時,使用表的別名;7、盡量避免使用遊標等等。

資料庫SQL調優的幾種方式是什麼

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

一.建立索引

1、要盡量避免全表掃描,首先應考慮在where 及order by 所涉及的列上建立索引 

#2、(1)在經常需要進行檢索的欄位上建立索引,例如要按照表格欄位username進行檢索,那麼就應該在姓名欄位上建立索引,如果經常要按照員工部門和員工職位層級進行檢索,那麼就應該在員工部門和員工職位層級這兩個欄位上建立索引。 

(2)建立索引為檢索帶來的效能提升往往是巨大的,因此在發現檢索速度過慢的時候應該首先想到的就是建立索引。 

(3)一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。索引並不是越多越好,索引固然可以提高相應的select 的效率,但同時也降低了insert 及update 的效率,因為insert 或update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。

二.避免在索引上使用計算

在where字句中,如果索引列是計算或函數的一部分,DBMS的最佳化器將不會使用索引而使用全表查詢,函數屬於計算的一種,同時在in和exists中通常情況下使用EXISTS,因為in不走索引

效率低:

 select * from user where salary*22>11000(salary是索引列)
登入後複製

效率高:

 select * from user where salary>11000/22(salary是索引列)
登入後複製

三.使用預編譯查詢

程式中通常是根據使用者的輸入來動態執行SQL,這時應該盡量使用參數化SQL,這不僅可以避免SQL注入漏洞攻擊,最重要資料庫會對這些參數化SQL進行預編譯,這樣第一次執行的時候DBMS會為這個SQL語句進行查詢最佳化並且執行預編譯,這樣以後再執行這個SQL的時候就直接使用預編譯的結果,這樣可以大大提高執行的速度。

四.盡量將多條SQL語句壓縮到一句SQL中

每次執行SQL的時候都要建立網路連線、進行權限校驗、進行SQL語句的查詢最佳化、傳送執行結果,這個過程是非常耗時的,因此應該盡量避免過多的執行SQL語句,能夠壓縮到一句SQL執行的語句就不要用多條來執行。

五.用where字句替換HAVING字句

避免使用HAVING字句,因為HAVING只會在檢索出所有記錄之後才對結果集進行過濾,而where則是在聚合前刷選記錄,如果能透過where字句限制記錄的數目,那就能減少這方面的開銷。 HAVING中的條件一般用於聚合函數的過濾,除此之外,應該將條件寫在where字句中。

六.使用表的別名

當在SQL語句中連接多個表時,請使用表的別名並把別名前綴於每個列名上。這樣就可以減少解析的時間並減少
少哪些友列名歧義所造成的語法錯誤。

七.用union all取代union

當SQL語句需要union兩個查詢結果集合時,即使檢索結果中不會有重複的記錄,如果使用union這兩個結果集同樣會嘗試進行合併,然後在輸出最終結果前進行排序,因此如果可以判斷檢索結果中不會有重複的記錄時候,應該用union all,這樣效率就會因此得到提高。

八.考慮使用「臨時表」暫存中間結果

簡化SQL語句的重要方法就是採用臨時表暫存中間結果,但是,臨時表的好處遠不止這些,將臨時結果暫存在臨時表,後面的查詢就在tempdb中了,這可以避免程序中多次掃描主表,也大大減少了程序執行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了並發性能。 

但也要避免經常建立和刪除臨時表,以減少系統表資源的消耗。

九.只在必要的情況下才使用事務begin translation

SQL Server中一句SQL語句預設就是一個事務,在該語句執行完成後也是預設commit的。其實,這就是begin tran的一個最小化的形式,好比在每句語句開頭隱含了一個begin tran,結束時隱含了一個commit。 

有些情況下,我們需要明確聲明begin tran,例如做「插、刪、改」操作需要同時修改幾個表,要求要嘛幾個表都修改成功,要嘛都不成功。 begin tran 可以起到這樣的作用,它可以把若干SQL語句套在一起執行,最後再一起commit。好處是保證了數據的一致性,但任何事情都不是完美無缺的。 Begin tran付出的代價是在提交之前,所有SQL語句鎖住的資源都不能釋放,直到commit掉。 

可見,如果Begin tran套住的SQL語句太多,那資料庫的效能就糟了。在該大事務提交之前,必然會阻塞別的語句,造成block很多。 

Begin tran所使用的原則是,在確保資料一致性的前提下,begin tran 套住的SQL語句越少越好!有些情況下可以採用觸發器同步數據,不一定要用begin tran。

十.盡量避免使用遊標

盡量避免向客戶端傳回大數據量,若資料量過大,應考慮相應需求是否合理。因為遊標的效率較差,如果遊標操作的資料超過1萬行,那麼就應該考慮改寫。

十一.用varchar/nvarchar 取代 char/nchar

更多程式相關知識,可存取:程式設計入門! !

以上是資料庫SQL調優的幾種方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板