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