MySQL 效能優化,讓資料庫跑的更快
在資料庫最佳化工作中,使資料盡可能的小,使表在硬碟上佔據的空間盡可能的小,這是最常用、也是最有效的手段之一。因為縮小數據,相對來說可以提高硬碟的讀寫速度,並且在查詢過程中小表的內容處理時所佔用的系統資源比較少。同理,如果在比較小的欄位上設定索引的話,其索引所佔用的資源也會比較少。那麼資料庫管理員該如何給自己的資料減肥呢?對此筆者有以下幾個建議。
建議一:空值不一定不佔空間
在這裡筆者先給大家掃盲一下。有些資料庫管理員,認為空值不會佔用系統資源,其實這是一個錯誤的認知。他們在資料庫設計時,不喜歡將欄位的屬性設為NOT NULL。而讓使用者根據自己的需求來輸入資料。筆者認為,這種做法對於資料庫的效能是不利的
筆者的意見是,如果有可能的話,盡量將欄位設為NOT NULL,即不允許有空值。這麼做的話,可以加快後續處理的速度,同時從資料儲存來看還可以使得每列節省一位,從而達到資料減肥的目的。在實際工作中,如果有些情況不需要使用者輸入資料時,也可以透過預設欄位來達到非空的目的。如在薪資系統中,可以將使用者的工作年限預設為0,而不是空白。當然,如果確實需要NULL的話,也沒有辦法。但是身為資料庫工程師來說,要盡量避免使用NULL值。
建議二:使用盡量小的資料型別
資料型別的大小也會影響到基礎表的大小。如對於MEDIUMINT和INT兩個數據類型,其都可以用來保存整數型的數據,只是其能夠保存的精度不同而已。但從儲存資料的角度來看,前者所需的儲存空間比後者節省約25%。為此在能夠使用MEDIUMINT的情況下,就不要使用INT。
另外在定義資料長度的時候,在滿足需求的情況下,也要盡量的短。如現在薪資考核系統中有員工編碼一個欄位。如果企業員工編碼已經確定,有五位字元構成。那麼在定義欄位時,只需要定義5個字元的長度。這不僅可以縮小儲存空間,還可以起到一定的資料校對功能。當使用者輸入的編碼長度超過5位元時,資料將無法儲存。
雖然說保存某個資料可以有很多資料型別可以選擇,也可以定義比較大的字元位數。但選擇盡量小的資料類型,可以幫助降低資料儲存空間,達到資料減肥的目的。從而進一步提升資料庫的效能。
建議三:索引與資料表大小的關係
筆者在文章一開頭就談到過,如果對於比較小的列設定索引,那麼索引也會佔用比較少的資源。可見,索引與資料表大小也有緊密的關聯。在適當的地方、適當的時機設定適當的索引,也可以達到資料減肥的目的。
如通常情況下,每張資料表可能會有多個索引,但是主索引往往只有一個。為此對於每張表的主索引應該考慮盡量的短小精悍。這可以幫助資料庫更快的進行識別。
再如盡量對前綴進行索引。如現在有一張表,需要對某個列設定索引。而這個列有一個特點,就是在頭幾個字元上有唯一的前綴。如果存在這種情況的話,那麼緊緊索引這個前綴,而不是全部,效果會更好。在MySQL資料庫中,支援對一個字元列的最左邊部分建立一個索引。這也就是說,資料庫會將某個欄位根據一定的規則拆分為前後兩個部分。拆分後前面一部分的資料如果能夠保持唯一,那麼就只需要對前面一部分設定索引即可,而不需要對整個欄位的資料設定索引。這無疑可以縮小索引所佔用的資源,實現減肥的目的。更短的索引,能夠提供更快的查詢速度。因為它們所佔用的硬碟空間較少,而且他們將在索引快取中保存更多的存取。從而降低硬碟的搜尋次數,提高查詢的效率。
最後要注意的就是,索引不能夠濫用。使用索引確實可以提高資料的處理能力,但是索引同時也會帶來額外的開銷。只有這個收益大於開銷時,使用索引才能夠提升資料庫的效能。否則的話,則會起到相反的效果。如某個表需要進行快速的存儲,如果在這個表上設定過多的索引,索引就會起到副作用。對此筆者建議,如果主要透過搜尋列的組合來存取一個表,那麼最好對他們只設定一個索引。當然,這個索引部分應該是日常工作中最常用的欄位。在不得已的情況下,如果需要使用多個索引的話,那麼最好能夠以更多的副本使用列來獲得更好的索引壓縮。從而降低因為使用了多個索引而增加的資源消耗。
建議四:在需要「豐滿」的地方還是不能夠節省
一個女人,該瘦的地方要瘦,該豐滿的地方要豐滿。其實資料庫也是如此。能夠節省硬碟空間的地方,就要節省。而不能夠節省的地方,則不能夠為了減肥而精簡下來。有時候這會起到適得其反的效果。
筆者以Varchar為例。如在MyISAM標中,如果沒有任何可變長的列,那麼最好使用固定大小的資料類型。雖然採用固定長度的資料類型,往往會浪費一定的儲存空間。因為如果使用者輸入的資料不足,採用固定長度的話,資料儲存時仍會以這個固定的長度來儲存。但是在這種情況下,能夠用固定長度的,還是要使用固定長度。因為這種情況下雖然會浪費一定的硬碟空間,但卻可以提高資料的查詢速度。
可見,並不是在任何情況下對資料減肥都可以提高資料庫的效能。這就好像節支開源,這個節省要節省在刀刃上。否則的話,不但不能夠節支,而且還會搬石頭砸自己的腳。通俗的說,就是該瘦的地方要瘦,該豐滿的地方要豐滿。記住這句話,就對了。
建議五:將表格分割以實現減肥的目的
螞蟻在搬食物時,如果某塊食物過大,無法搬動的話,螞蟻則可能會將這個塊食物進行分割,直到其搬得動為止。這就是分蛋糕原理。其實這種現像在日常工作中常很常見。如我們有一張資料庫表格,如果裡面的紀錄非常多,那麼表格的允許速度會非常的慢。在這種情況下,可以根據一定的規則將表格分為多個工作簿。如現在有企業員工的考勤資訊。對這個表進行查詢、排序、統計時,等待時間非常的長。此時就可以根據部門將其分割成不同的工作簿,然後再對其進行相關的數據分析。此時雖然工作量會大一點,但是其處理的速度會變快許多
根據這個原理,在資料庫優化時,可以將一個經常被掃描的大表分割為2個或2個以上的表示非常有益的。如在日常工作中,筆者現在有一個動態格式的資料表,而這個資料是使用一個掃描表時,就會用這個來找出相關行的比較小的靜態格式的表。
透過這個表格的拆分,可以將一塊大蛋糕分成幾塊小的蛋糕,以利於後續資料的統計與分析。當然這個效果的好壞,直接跟這個分割的規則有關。關於表如何拆分才能夠達到理想的效果,這又是一個比較大的話題。由於這裡篇幅有限,筆者不做過多的說明。或許在後續的文章中,筆者會以這命題進行展開,給大家做詳細的說明。
以上就是MySQL 效能優化,讓資料庫跑的更快的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

在 Navicat 中執行 SQL 的步驟:連接到數據庫。創建 SQL 編輯器窗口。編寫 SQL 查詢或腳本。單擊“運行”按鈕執行查詢或腳本。查看結果(如果執行查詢的話)。

Navicat 連接數據庫時常見的錯誤及解決方案:用戶名或密碼錯誤(Error 1045)防火牆阻止連接(Error 2003)連接超時(Error 10060)無法使用套接字連接(Error 1042)SSL 連接錯誤(Error 10055)連接嘗試過多導致主機被阻止(Error 1129)數據庫不存在(Error 1049)沒有權限連接到數據庫(Error 1000)
