數(shù)據(jù)庫SQL調(diào)優(yōu)的方式有哪些

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

站在用戶的角度思考問題,與客戶深入溝通,找到西充網(wǎng)站設(shè)計(jì)與西充網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋西充地區(qū)。

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

本教程操作環(huán)境:windows7系統(tǒng)、MySQL8版本、Dell G3電腦。

一.創(chuàng)建索引

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

2、(1)在經(jīng)常需要進(jìn)行檢索的字段上創(chuàng)建索引,比如要按照表字段username進(jìn)行檢索,那么就應(yīng)該在姓名字段上創(chuàng)建索引,如果經(jīng)常要按照員工部門和員工崗位級別進(jìn)行檢索,那么就應(yīng)該在員工部門和員工崗位級別這兩個字段上創(chuàng)建索引。

(2)創(chuàng)建索引給檢索帶來的性能提升往往是巨大的,因此在發(fā)現(xiàn)檢索速度過慢的時候應(yīng)該首先想到的就是創(chuàng)建索引。

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

二.避免在索引上使用計(jì)算

在where字句中,如果索引列是計(jì)算或者函數(shù)的一部分,DBMS的優(yōu)化器將不會使用索引而使用全表查詢,函數(shù)
屬于計(jì)算的一種,同時在in和exists中通常情況下使用EXISTS,因?yàn)閕n不走索引
效率低:

 select * from user where salary*22>11000(salary是索引列)

效率高:

 select * from user where salary>11000/22(salary是索引列)

三.使用預(yù)編譯查詢

程序中通常是根據(jù)用戶的輸入來動態(tài)執(zhí)行SQL,這時應(yīng)該盡量使用參數(shù)化SQL,這樣不僅可以避免SQL注入漏洞

攻擊,最重要數(shù)據(jù)庫會對這些參數(shù)化SQL進(jìn)行預(yù)編譯,這樣第一次執(zhí)行的時候DBMS會為這個SQL語句進(jìn)行查詢優(yōu)化

并且執(zhí)行預(yù)編譯,這樣以后再執(zhí)行這個SQL的時候就直接使用預(yù)編譯的結(jié)果,這樣可以大大提高執(zhí)行的速度。

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

每次執(zhí)行SQL的時候都要建立網(wǎng)絡(luò)連接、進(jìn)行權(quán)限校驗(yàn)、進(jìn)行SQL語句的查詢優(yōu)化、發(fā)送執(zhí)行結(jié)果,這個過程
是非常耗時的,因此應(yīng)該盡量避免過多的執(zhí)行SQL語句,能夠壓縮到一句SQL執(zhí)行的語句就不要用多條來執(zhí)行。

五.用where字句替換HAVING字句

避免使用HAVING字句,因?yàn)镠AVING只會在檢索出所有記錄之后才對結(jié)果集進(jìn)行過濾,而where則是在聚合前
刷選記錄,如果能通過where字句限制記錄的數(shù)目,那就能減少這方面的開銷。HAVING中的條件一般用于聚合函數(shù)
的過濾,除此之外,應(yīng)該將條件寫在where字句中。

六.使用表的別名

當(dāng)在SQL語句中連接多個表時,請使用表的別名并把別名前綴于每個列名上。這樣就可以減少解析的時間并減
少哪些友列名歧義引起的語法錯誤。

七.用union all替換union

當(dāng)SQL語句需要union兩個查詢結(jié)果集合時,即使檢索結(jié)果中不會有重復(fù)的記錄,如果使用union這兩個結(jié)果集
同樣會嘗試進(jìn)行合并,然后在輸出最終結(jié)果前進(jìn)行排序,因此如果可以判斷檢索結(jié)果中不會有重復(fù)的記錄時候,應(yīng)
該用union all,這樣效率就會因此得到提高。

八.考慮使用“臨時表”暫存中間結(jié)果

簡化SQL語句的重要方法就是采用臨時表暫存中間結(jié)果,但是,臨時表的好處遠(yuǎn)遠(yuǎn)不止這些,將臨時結(jié)果暫存在臨時表,后面的查詢就在tempdb中了,這可以避免程序中多次掃描主表,也大大減少了程序執(zhí)行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了并發(fā)性能。
但是也得避免頻繁創(chuàng)建和刪除臨時表,以減少系統(tǒng)表資源的消耗。

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

SQL Server中一句SQL語句默認(rèn)就是一個事務(wù),在該語句執(zhí)行完成后也是默認(rèn)commit的。其實(shí),這就是begin tran的一個最小化的形式,好比在每句語句開頭隱含了一個begin tran,結(jié)束時隱含了一個commit。
有些情況下,我們需要顯式聲明begin tran,比如做“插、刪、改”操作需要同時修改幾個表,要求要么幾個表都修改成功,要么都不成功。begin tran 可以起到這樣的作用,它可以把若干SQL語句套在一起執(zhí)行,最后再一起commit。 好處是保證了數(shù)據(jù)的一致性,但任何事情都不是完美無缺的。Begin tran付出的代價(jià)是在提交之前,所有SQL語句鎖住的資源都不能釋放,直到commit掉。
可見,如果Begin tran套住的SQL語句太多,那數(shù)據(jù)庫的性能就糟糕了。在該大事務(wù)提交之前,必然會阻塞別的語句,造成block很多。
Begin tran使用的原則是,在保證數(shù)據(jù)一致性的前提下,begin tran 套住的SQL語句越少越好!有些情況下可以采用觸發(fā)器同步數(shù)據(jù),不一定要用begin tran。

十.盡量避免使用游標(biāo)

盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應(yīng)該考慮相應(yīng)需求是否合理。因?yàn)橛螛?biāo)的效率較差,如果游標(biāo)操作的數(shù)據(jù)超過1萬行,那么就應(yīng)該考慮改寫。

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

以上是“數(shù)據(jù)庫SQL調(diào)優(yōu)的方式有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章題目:數(shù)據(jù)庫SQL調(diào)優(yōu)的方式有哪些
文章來源:http://bm7419.com/article0/pcsjio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)公司軟件開發(fā)、網(wǎng)站導(dǎo)航、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司