亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫SQL調優的方式有哪些

發布時間:2021-04-25 09:29:40 來源:億速云 閱讀:236 作者:小新 欄目:MySQL數據庫

小編給大家分享一下數據庫SQL調優的方式有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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

本教程操作環境: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調優的方式有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

京山县| 大冶市| 望奎县| 景德镇市| 广饶县| 翁源县| 鄱阳县| 建宁县| 互助| 定兴县| 徐汇区| 延安市| 余庆县| 鲜城| 土默特左旗| 南江县| 仁布县| 澎湖县| 孟连| 石河子市| 潍坊市| 芜湖市| 青冈县| 邢台市| 唐山市| 西乡县| 娄底市| 马鞍山市| 武乡县| 华坪县| 余江县| 阿拉善右旗| 杭锦后旗| 葵青区| 二连浩特市| 吉木萨尔县| 罗江县| 高碑店市| 东阳市| 晴隆县| 融水|