Web開發(fā)人員的十個數(shù)據(jù)庫優(yōu)化優(yōu)秀實踐
數(shù)據(jù)庫優(yōu)化已經(jīng)成為web開發(fā)人員提高web應(yīng)用程序性能,從而改善用戶體驗的關(guān)鍵。對一些人來說,這可能聽起來不太吸引人,但好處是值得的。如果正確地優(yōu)化數(shù)據(jù)庫,就可以提高性能、減少瓶頸并節(jié)省資源。
幸運的是,有些優(yōu)化技術(shù)在sql查詢中不需要dba級別(數(shù)據(jù)庫管理員)的專業(yè)知識。
為了幫助你開始,我們將看看10個最佳實踐,為web開發(fā)者如何優(yōu)化你的數(shù)據(jù)庫。一旦您了解了這些,您就可以更深入地研究數(shù)據(jù)庫優(yōu)化。
一、在選擇查詢中使用EXPLAIN
使用EXPLAIN關(guān)鍵字是快速修復(fù)慢速查詢的好方法。它讓您了解如何執(zhí)行查詢,并幫助您找到查詢優(yōu)化的潛在位置。
只需在SELECT查詢前輸入EXPLAIN關(guān)鍵字。這不會觸發(fā)實際的查詢,相反,您將看到執(zhí)行計劃。
當(dāng)您仔細(xì)查看結(jié)果時,您將能夠確定潛在的瓶頸或任何其他問題,如缺少索引,并減少掃描行的數(shù)量。
有了EXPLAIN工具,您可以優(yōu)化查詢,如果有必要,甚至可以改進(jìn)表結(jié)構(gòu)。
二、向搜索列添加索引
如果您按特定列搜索表,則很可能通過索引該列來提高查詢性能。
通過向搜索列添加索引,可以減少響應(yīng)時間并優(yōu)化資源使用。盡管索引可能對所有查詢都沒有幫助,但在大多數(shù)情況下它絕對有用。
但是要記住,有索引的表比沒有索引的表需要更多的時間來更新。這是因為索引也需要更新。因此,明智的做法是只為頻繁搜索的列創(chuàng)建索引,而不是為更新比讀取次數(shù)更多的表創(chuàng)建索引。
三、盡可能的使用標(biāo)識字段
在表中使用Identity字段作為主鍵有幾個好處。
首先,它更快—您可以在查詢中簡單地使用整數(shù),而不是更長的字符串字段。這將為您節(jié)省一些內(nèi)存,因為整數(shù)可以更短。
其次,它更安全——使用應(yīng)用程序數(shù)據(jù)字段可能會導(dǎo)致許多問題。例如,如果您使用名稱或地址作為PRIMARY KEY,那么如果客戶端或用戶更改了他們的名稱、移動了,甚至只是出現(xiàn)了拼寫錯誤,那么您可能會遇到問題。
因此,為了加快查詢速度并提高工作效率,可以在每個表中添加一個Identity列,這樣就可以使用它作為一個PRIMARY KEY,并使用AUTO_INCREMENT和一個合適類型的INT變量。
四、默認(rèn)情況下避免使用 NULL 值
盡量使用NOT NULL代替NULL。
一般來說,選擇NOT NULL意味著更快的查詢,這得益于更有效地使用索引,并避免了專門測試每個值是否為NULL的需要。最重要的是,你使用更少的存儲空間,根據(jù)MySQL文檔,NULL列需要額外的空間。
節(jié)省空間是特別重要的,如果你使用一個網(wǎng)絡(luò)主機(jī)為你的數(shù)據(jù)庫,因為即使一些最好的網(wǎng)絡(luò)主機(jī)服務(wù)也不能提供無限的存儲空間。現(xiàn)在,每個專欄節(jié)省一個比特看起來并不是很多,但是如果你在經(jīng)營一個電子商務(wù)商店,有成千上萬的產(chǎn)品,你會節(jié)省很多資源。
使用NOT NULL,您將能夠像處理任何變量一樣處理字段,同時避免使用NULL可能產(chǎn)生的某些邊緣情況。
當(dāng)然,仍然有一些情況下使用NULL更有益—但在大多數(shù)情況下,您可以使用NOT NULL實現(xiàn)相同的結(jié)果。
五、對查詢使用無緩沖模式
為了節(jié)省時間和內(nèi)存,可以使用無緩沖查詢。
默認(rèn)情況下,SQL查詢使用緩沖模式。這會增加您的等待時間并消耗資源,因為在查詢完成之前不會返回結(jié)果—而是存儲在內(nèi)存中。如果是較大的查詢,并且您有一個巨大的數(shù)據(jù)庫,那么使用緩沖查詢將需要大量內(nèi)存。
相比之下,當(dāng)使用無緩沖查詢時,在執(zhí)行查詢之前不會自動存儲結(jié)果。一旦檢索到第一行,您就可以開始處理它們。
但是請記住,在處理結(jié)果集時,未緩沖查詢不允許在同一個連接上發(fā)出進(jìn)一步的查詢。
六、使列緊湊
優(yōu)化磁盤空間對于保持?jǐn)?shù)據(jù)庫引擎良好運行至關(guān)重要。確保不會影響性能的一種非常簡單的方法是使用小而緊湊的列。
因此,您應(yīng)該始終選擇對您的應(yīng)用程序最有用的整數(shù)類型。例如,如果您知道您的表不會有大量的行,那么不要自動使用INT作為主鍵—您實際上可能會從使用SMALLINT甚至TINYINT中受益。
對于DATE和DATETIME也是如此——如果您不特別需要時間部分,只需使用DATE即可。DATETIME數(shù)據(jù)類型占用8個字節(jié),而DATE只占用3個字節(jié)—因此這樣可以節(jié)省5個字節(jié)。
七、保持表的靜態(tài)(固定長度)
另一種優(yōu)化數(shù)據(jù)庫性能的方法是使用靜態(tài)表。
這意味著您的表不應(yīng)該包括任何長度可變的列,如TEXT或BLOB。您可以使用CHAR、VARCHAR、BINARY和VARBINARY列,但是需要填充它們以匹配指定的列寬度。
使用固定長度的表是有益的,因為它們更快,更容易緩存。除此之外,靜態(tài)表更安全——它們在崩潰后更容易重建。
但是,靜態(tài)表在某些情況下可能比動態(tài)格式的表需要更多的磁盤空間—特別是當(dāng)您使用CHAR和VARCHAR列時。但是性能上的改進(jìn)可能會超過對磁盤空間的任何關(guān)注。
八、安裝對象關(guān)系映射器(ORM)
使用ORM是優(yōu)化數(shù)據(jù)庫工作方式的另一種好方法。
首先,ORM有助于消除人為錯誤因素,因為它為您做了很多事情。您不必自己編寫那么多代碼,而且ORM會為您處理許多重復(fù)的任務(wù),從而減少您的工作量。
ORM還可以提高系統(tǒng)的安全性,因為準(zhǔn)備和清理查詢使SQL注入變得更加困難。
最重要的是,ORM將在內(nèi)存中緩存實體,這減少了數(shù)據(jù)庫和CPU的負(fù)載。
當(dāng)然,ORM有其優(yōu)點和缺點,可能并不完全適合您的使用。但是有一些簡單的方法可以避免濫用對象-關(guān)系映射。此外,還有一些其他的性能調(diào)優(yōu)和優(yōu)化插件可能更適合您。
九、批量執(zhí)行DELETE和UPDATE查詢
刪除和更新數(shù)據(jù)——尤其是在非常大的表中——可能會很復(fù)雜。這可能會花費很多時間,而且這兩個命令都作為單個事務(wù)執(zhí)行。這意味著,如果出現(xiàn)任何中斷,整個事務(wù)都必須回滾,這可能會更加耗時。
但是,如果您遵循了批量運行DELETE和UPDATE查詢的良好實踐,您將能夠通過增加并發(fā)性和減少瓶頸來節(jié)省時間。
如果一次刪除和更新的行數(shù)較少,則可以在將批提交到磁盤時執(zhí)行其他查詢。而且您可能需要做的任何回滾都將花費更少的時間。
十、使用程序分析()獲得更多提示
優(yōu)化數(shù)據(jù)庫的最后一個最佳實踐是使用內(nèi)置功能:PROCEDURE ANALYSE()。更具體地說,如果將該命令添加到某個SQL語句中,它將查看列,然后推薦最佳數(shù)據(jù)類型和數(shù)據(jù)長度。
在將新數(shù)據(jù)導(dǎo)入到表中之后——或者甚至檢查現(xiàn)有表中是否存在不一致的地方——這可能特別有用。
如果您實現(xiàn)了這些建議,您可能會節(jié)省一些空間。然而,請記住,這些只是建議,你必須真正考慮它們是否適合你的特定目的。
結(jié)論
數(shù)據(jù)庫優(yōu)化有點棘手,但完全避免它會對您的web應(yīng)用程序產(chǎn)生巨大的影響,導(dǎo)致性能問題。
如果你遵循了這10個web開發(fā)者數(shù)據(jù)庫優(yōu)化的最佳實踐,你將開始改善用戶體驗和資源管理。
一旦實現(xiàn)了這些方法,請進(jìn)一步了解如何提高數(shù)據(jù)庫性能的技巧。
原文鏈接:https://dzone.com/articles/10-database-optimization-best-practices-for-web-de?