首頁技術(shù)文章正文

怎樣優(yōu)化數(shù)據(jù)庫查詢?

更新時(shí)間:2021-05-11 來源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif


數(shù)據(jù)庫優(yōu)化查詢可以在查詢語句、索引、使用臨時(shí)表等方面進(jìn)行操作,具體如下:
(1)對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,應(yīng)先考慮在 where 或 order by 涉及的列上建立索引。
(2)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷。
(3)并非所有索引對(duì)查詢都有效,SQL是根據(jù)表中數(shù)據(jù)來進(jìn)行查詢優(yōu)化的,當(dāng)索引列有大量數(shù)據(jù)重復(fù)時(shí),查詢可能不會(huì)去利用索引。
(4)索引并不是越多越好,索引固然可以提高相應(yīng)的 select 的效率,但同時(shí)也降低了 insert 及 update 的效率,因?yàn)?insert 或 update 時(shí)有可能會(huì)重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個(gè)表的索引數(shù)最好不要超過6個(gè),若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要。
(5)應(yīng)盡可能的避免更新索引數(shù)據(jù)列,因?yàn)樗饕龜?shù)據(jù)列的順序就是表記錄的物理存儲(chǔ)順序,一旦該列值改變將導(dǎo)致整個(gè)表記錄的順序的調(diào)整,會(huì)耗費(fèi)相當(dāng)大的資源。若應(yīng)用系統(tǒng)需要頻繁更新索引數(shù)據(jù)列,那么需要考慮是否應(yīng)將該索引建為索引。
(6)盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計(jì)為字符型,這會(huì)降低查詢和連接的性能,并會(huì)增加存儲(chǔ)開銷。這是因?yàn)橐嬖谔幚聿樵兒瓦B接時(shí)會(huì)逐個(gè)比較字符串中每一個(gè)字符,而對(duì)于數(shù)字型而言只需要比較一次就夠了。
(7)盡可能的使用 varchar/nvarchar 代替 char/nchar ,因?yàn)樽冮L字段存儲(chǔ)空間小,可以節(jié)省存儲(chǔ)空間,其次對(duì)于查詢來說,在一個(gè)相對(duì)較小的字段內(nèi)搜索效率顯然要高些。

優(yōu)化查詢.jpg

(8)避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗。
(9)臨時(shí)表并不是不可使用,適當(dāng)?shù)厥褂盟鼈兛梢允鼓承├谈行?,例如,?dāng)需要重復(fù)引用大型表或常用表中的某個(gè)數(shù)據(jù)集時(shí)。但是,對(duì)于一次性事件,最好使用導(dǎo)出表。
(10)在新建臨時(shí)表時(shí),如果一次性插入數(shù)據(jù)量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先create table,然后insert。
(11)如果使用到了臨時(shí)表,在存儲(chǔ)過程的最后務(wù)必將所有的臨時(shí)表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統(tǒng)表的較長時(shí)間鎖定。





   

猜你喜歡:

MyBatis框架如何實(shí)現(xiàn)數(shù)據(jù)查詢?有幾種方法?

數(shù)據(jù)庫優(yōu)化的幾種方式詳細(xì)介紹

Python開發(fā)面試題目:如何優(yōu)化數(shù)據(jù)庫?    

黑馬程序員Python+大數(shù)據(jù)開發(fā)課程

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!