給數據減肥 讓MySQL數據庫跑的更快

  在數據庫優化工作中,使數據盡可能的小,使表在硬盤上占據的空間盡可能的小,這是最常用、也是最有效的手段之一。因為縮小數據,相對來說可以提高硬盤的讀寫速度,并且在查詢過程中小表的內容處理時所占用的系統資源比較少。同理,如果在比較小的列上設置索引的話,其索引所占用的資源也會比較少。那么數據庫管理員該如何給自己的數據減肥呢?對此筆者有如下幾個建議。

  建議一:空值并不一定不占用空間

  在這里筆者先給大家掃盲一下。有些數據庫管理員,認為空值不會占用系統資源,其實這是一個錯誤的認識。他們在數據庫設計時,不喜歡將字段的屬性設置為NOT NULL。而讓用戶根據自己的需要來輸入數據。筆者認為,這種做法對于數據庫的性能是不利的。

  筆者的意見是,如果有可能的話,盡量將列設置為NOT NULL,即不允許有空值。這么做的話,可以加快后續處理的速度,同時從數據存儲來看還可以使得每列節省一位,從而達到數據減肥的目的。在實際工作中,如果有些情況不需要用戶輸入數據時,還可以通過默認字段來達到非空的目的。如在薪資系統中,可以將用戶的工作年限默認設置為0,而不是空白。當然,如果確實需要NULL的話,也沒有辦法。但是作為數據庫工程師來說,要盡量避免使用NULL值。

  建議二:使用盡量小的數據類型

  數據類型的大小也會影響到基礎表的大小。如對于MEDIUMINT和INT兩個數據類型,其都可以用來保存整數型的數據,只是其能夠保存的精度不同而已。但是從存儲數據的角度來看,前者所需要的存儲空間要比后者節省25%左右。為此在能夠使用MEDIUMINT的情況下,就不要使用INT。

  另外在定義數據長度的時候,在滿足需求的情況下,也要盡量的短。如現在薪資考核系統中有員工編碼一個字段。如果企業員工編碼已經確定,有五位字符構成。那么在定義字段時,只需要定義5個字符的長度。這不僅可以縮小存儲空間,而且還可以起到一定的數據校對功能。當用戶輸入的編碼長度超過5位時,數據將無法保存。

  雖然說保存某個數據可以有很多數據類型可以選擇,也可以定義比較大的字符位數。但是選擇盡量小的數據類型,可以幫助降低數據存儲空間,達到數據減肥的目的。從而進一步提升數據庫的性能。

  建議三:索引與數據表大小的關系

  筆者在文章一開頭就談到過,如果對于比較小的列設置索引,那么索引也將占用比較少的資源。可見,索引與數據表大小也有緊密的聯系。在合適的地方、合適的時機設置合適的索引,也可以實現對數據減肥的目的。

  如通常情況下,每張數據表可能會有多個索引,但是主索引往往只有一個。為此對于每張表的主索引應該考慮盡量的短小精悍。這可以幫助數據庫更快的進行識別。

  再如盡量對前綴進行索引。如現在有一張表,需要對某個列設置索引。而這個列有一個特點,即在頭幾個字符上有唯一的前綴。如果存在這種情況的話,那么緊緊索引這個前綴,而不是全部,效果會更好。在MySQL數據庫中,支持對一個字符列的最左邊部分創建一個索引。這也就是說,數據庫會將某個字段根據一定的規則拆分為前后兩個部分。拆分后前面一部分的數據如果能夠保持唯一,那么就只需要對前面一部分設置索引即可,而不需要對整個字段的數據設置索引。這無疑可以縮小索引所占用的資源,實現減肥的目的。更短的索引,能夠提供更快的查詢速度。因為它們所占用的硬盤空間更少,而且他們將在索引緩存中保存更多的訪問。從而降低硬盤的搜索次數,提高查詢的效率。

  最后需要注意的就是,索引不能夠濫用。使用索引確實可以提高數據的處理能力,但是索引同時也會帶來額外的開銷。只有這個收益大于開銷時,使用索引才能夠提升數據庫的性能。否則的話,則會起到相反的效果。如某個表需要進行快速的存儲,如果在這個表上設置過多的索引,索引就會起到副作用。對此筆者建議,如果主要通過搜索列的組合來存取一個表,那么最好對他們只設置一個索引。當然,這個索引部分應該是日常工作中最常用的列。在不得已的情況下,如果需要使用多個索引的話,那么最好能夠以更多的副本使用列來獲得更好的索引壓縮。從而降低因為使用了多個索引而增加的資源消耗。

  建議四:在需要“豐滿”的地方還是不能夠節省

  一個女人,該瘦的地方要瘦,該豐滿的地方要豐滿。其實數據庫也是如此。能夠節省硬盤空間的地方,就要節省。而不能夠節省的地方,則不能夠為了減肥而將其精簡下來。有時候這會起到適得其反的效果。

  筆者以Varchar為例。如在MyISAM標中,如果沒有任何可變長的列,那么最好使用固定大小的數據類型。雖然采用固定長度的數據類型,往往會浪費一定的存儲空間。因為如果用戶輸入的數據不足,采用固定長度的話,數據存儲時仍然會按這個固定的長度來存儲。但是在這種情況下,能夠用固定長度的,還是要使用固定長度。因為這種情況下雖然會浪費一定的硬盤空間,但是卻可以提高數據的查詢速度。

  可見,并不是在任何情況下對數據減肥都可以提高數據庫的性能。這就好像節支開源,這個節省要節省在刀刃上。否則的話,不但不能夠節支,而且還會搬起石頭砸自己的腳。通俗的說,就是該瘦的地方要瘦,該豐滿的地方要豐滿。記住這句話,就對了。

  建議五:將表分割以實現減肥的目的

  螞蟻在搬食物時,如果某塊食物過大,無法搬動的話,螞蟻則可能會將這個塊食物進行分割,直到其搬得動為止。這就是分蛋糕原理。其實這種現象在日常工作中經常常見。如我們有一張數據庫表格,如果里面的紀錄非常多,那么表格的允許速度會非常的慢。在這種情況下,可以根據一定的規則將表分為多個工作簿。如現在有一份企業員工的考勤信息。對這個表進行查詢、排序、統計時,等待時間非常的長。此時就可以根據部門將其分割成不同的工作簿,然后再對其進行相關的數據分析。此時雖然工作量會大一點,但是其處理的速度會變快許多。

  根據這個原理,在數據庫優化時,可以將一個經常被掃描的大表分割為2個或者2個以上的表示非常有益的。如在日常工作中,筆者現在有一個動態格式的數據表,并且這個數據是使用一個掃描表時,就會用這個來找出相關行的比較小的靜態格式的表。

  通過這個表的拆分,可以將一塊大蛋糕分為幾塊小的蛋糕,以利于后續數據的統計與分析。當然這個效果的好壞,直接跟這個拆分的規則有關。關于表如何拆分才能夠達到理想的效果,這又是一個比較大的話題。由于這里篇幅有限,筆者不做過多的說明。或許在后續的文章中,筆者會以這命題進行展開,給大家做詳細的說明。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445029.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445029.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445029.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法(15)-leetcode-explore-learn-數據結構-運用遞歸解決二叉樹的問題

leetcode-explore-learn-數據結構-二叉樹2本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/

leetcode538 把二叉搜索樹轉換成累加樹

給定一個二叉搜索樹(Binary Search Tree),把它轉換成為累加樹(Greater Tree),使得每個節點的值是原來的節點值加上所有大于它的節點值之和。 對于每一個點來說,自己的父,和自己父的右子樹都是大…

AWK常用命令華(1)

awk 調用: 1.調用awk:

AWk的調用精華

awk 的調用方式 awk 提供了適應多種需要的不同解決方案,它們是: 一、awk 命令行,你可以象使用普通UNIX 命令一樣使用awk,在命令行中你也可以使用awk 程序設計語言,雖然awk 支持多行的錄入,但是錄入長長的命令行并保證其正 確無誤卻是一件令人頭疼的事,因此,這種方法一般…

算法(16)-leetcode-explore-learn-數據結構-二叉樹總結

leetcode-explore-learn-數據結構-二叉樹3本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/所有例題的編程…

leetcode15 三數之和

給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a b c 0 ?找出所有滿足條件且不重復的三元組。 注意:答案中不可以包含重復的三元組。 例如, 給定數組 nums [-1, 0, 1,…

AWK再次認識--內置的參數,以及編寫腳本

原本這是篇給公司內同事寫的培訓文章,對于初學awk的人還蠻有幫助,貼到這里與大家共享一下。 〇、前言 意見反饋,請mailto:datouwanggmail.com。 一、AWK簡介 AWK名字來源于三位創造者Aho、Weinberger和Kernighan統稱。 AWK擅長處理文本數據。…

AWk高級編程

首先再說一說awk的工作流程還是有必要的 : 執行awk時, 它會反復進行下列四步驟. 1. 自動從指定的數據文件中讀取一個數據行. 2. 自動更新(Update)相關的內建變量之值. 如 : NF, NR, $0... 3. 依次執行程序中所有 的 Pattern { Actions } 指令. 4. 當執行完程序中所有 Pattern {…

leetcode19. 刪除鏈表的倒數第N個節點

給定一個鏈表,刪除鏈表的倒數第 n 個節點,并且返回鏈表的頭結點。 示例: 給定一個鏈表: 1->2->3->4->5, 和 n 2. 當刪除了倒數第二個節點后,鏈表變為 1->2->3->5. 說明: 給定的 n 保證是有效…

python模塊(5)-Matplotlib 簡易使用教程

Matplotlib簡易使用教程0.matplotlib的安裝1.導入相關庫2.畫布初始化2.1 隱式創建2.2 顯示創建2.3 設置畫布大小2.4 plt.figure()常用參數3.plt. 能夠繪制圖像類型3.1等高線3.2 箭頭arrow4.簡單繪制小demodemo1.曲線圖demo2-柱狀、餅狀、曲線子圖5.plt.plot()--設置曲線顏色,粗…

random_shuffle 和transform算法

1)STL中的函數random_shuffle()用來對一個元素序列進行重新排序(隨機的),函數原型如下: std::random_shuffle

C語言字符輸出格式化

符號屬性 長度屬性 基本型 所占 位數 取值范圍 輸入符舉例 輸出符舉例 -- -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%u signed -- char 8 -2^7 ~ 2^7-1 %c %c、%d、%u unsigned -- char 8 0 ~ 2^8-1 %c %c、%d、%u [signed] short [int] 16 -2^15 ~ 2^15-1 %hd %hd unsigned short […

leetcode20 有效的括號

給定一個只包括 (,),{,},[,] 的字符串,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。 左括號必須以正確的順序閉合。 注意空字符串可被認為是有效字符串。 示…

python模塊(6)-Pandas 簡易使用教程

Pandas 簡易教程1.Pandas簡介2.創建2.1創建dataFrame2.2創建Series3.dataframe數據訪問3.1 獲取一列--列標簽3.2 獲取多列--列標簽列表3.3 獲取一行--行標簽.loc()3.4 獲取多行--行切片操作.loc()3.5 index 獲取行列信息--df.iloc()3.6 獲取一個元素3.7 布爾值選擇數據4.datafr…

windows 如何查看端口占用情況?

開始--運行--cmd 進入命令提示符 輸入netstat -ano 即可看到所有連接的PID 之后在任務管理器中找到這個PID所對應的程序如果任務管理器中沒有PID這一項,可以在任務管理器中選"查看"-"選擇列" 經常,我們在啟動應用的時候發現系統需要的端口被別的…

泛型lua的for循環以及lua的特殊的dowhile循環

范型for循環: -- print all values of array a a{1,2,3,4,5,6,7}; for i,v in ipairs(a) do print(v) end 范型for遍歷迭代子函數返回的每一個值。 再看一個遍歷表key的例子: -- print all keys of table t map {["gaoke"]1,["gaoxin&…

leetcode1 兩數之和

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。 示例: 給定 nums [2, 7, 11, 15], t…

Linux(5)-用戶/權限-adduser,su,chmod

用戶、權限管理1. adduserstep1: 添加新用戶step2: 賦予sudo權限。step3: 刪除用戶2. useradd (建議不要使用)3. 切換用戶su4. 查看系統中所有用戶5. 修改用戶對路徑/文件的讀寫權限1. adduser step1: 添加新用戶 sudo adduser username 按照提示輸入新…

網絡游戲服務器架構

網絡游戲一般采用C/S結構,客戶端負責繪制游戲世界的實時畫面,服務器端則負責響應所有客戶端的連接請求和游戲邏輯處理,并控制所有客戶端的畫面繪制,客戶端與服務器通過網絡數據包交互完成每一步游戲邏輯。 網關服務器方式&#x…

leetcode3 無重復字符最長子串

給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。 示例 2: 輸入: "bbbbb" 輸出: 1 解釋: 因為無重復字符…