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