新聞中心
優(yōu)化數(shù)據(jù)庫的7個技巧

作為一名數(shù)據(jù)庫管理員,如何保證數(shù)據(jù)庫的高效、穩(wěn)定運行是每天必須面對的任務。在高負載下,優(yōu)化數(shù)據(jù)庫可顯著地提升數(shù)據(jù)庫的性能,保障數(shù)據(jù)的高可用性,避免因數(shù)據(jù)異常帶來的安全風險。本文將介紹
1. 確定業(yè)務需求
在優(yōu)化數(shù)據(jù)庫之前,首先需要確定業(yè)務需求。根據(jù)業(yè)務需求來設計合理的數(shù)據(jù)庫結構,設置合適的索引,并合理選擇數(shù)據(jù)庫引擎。例如,若應用程序的數(shù)據(jù)量很大,則應使用InnoDB引擎,它支持事務和行級鎖定,并具有良好的穩(wěn)定性和安全性。
2. 創(chuàng)建索引
索引是一種特殊的數(shù)據(jù)結構,可快速定位數(shù)據(jù),縮短查詢時間。同時,索引的創(chuàng)建也需要權衡選擇。過多的索引會增加數(shù)據(jù)庫的負擔,導致查詢性能降低。因此,索引的建立需遵循以下原則:
– 優(yōu)先選擇主鍵和唯一約束字段
– 索引過多的表不要建立過多索引(不超過5個)。
– 不要為搜索文本,布爾類型等字段建立索引。
– 對比數(shù)組等大型數(shù)據(jù)類型應該避免索引。
3. 修改參數(shù)設置
數(shù)據(jù)庫參數(shù)設置的好壞能決定數(shù)據(jù)庫的性能,可以通過修改參數(shù)設置來提升數(shù)據(jù)庫的性能。例如:
– 適當?shù)脑黾踊驕p少內存緩沖池的大小,可大幅度提升MySql的讀寫性能,降低磁盤I/O。
– 對于高并發(fā)的方式,適當增加或減少MySql的線程池大小,可縮短請求響應時間,優(yōu)化系統(tǒng)的吞吐率。
4. 數(shù)據(jù)庫備份和恢復
數(shù)據(jù)備份和恢復是數(shù)據(jù)庫管理中非常重要的部分。數(shù)據(jù)備份目的是保證數(shù)據(jù)可靠,而恢復則是保證系統(tǒng)正常。在備份和恢復過程中,常常會遇到問題,如備份文件過大,恢復時間過長,空間不足等問題。對此,有以下意見:
– 每日需建立完備份。
– 在恢復之前,先確認新數(shù)據(jù)是否覆蓋先前的數(shù)據(jù)。
– 在備份大型數(shù)據(jù)之前,需要優(yōu)化服務器的內存使用率。
– 根據(jù)數(shù)據(jù)量,可以選擇硬盤,云盤等,提高業(yè)務的數(shù)據(jù)安全性和可靠性。
5. 常規(guī)的系統(tǒng)維護和優(yōu)化
系統(tǒng)維護和優(yōu)化在數(shù)據(jù)庫管理中也是必不可少的一部分。其中的主要工作內容包括:
– 定期檢查和清理數(shù)據(jù)庫中的冗余數(shù)據(jù)和無效數(shù)據(jù)
– 定期優(yōu)化數(shù)據(jù)庫以保持數(shù)據(jù)的良好性能
– 每日檢查數(shù)據(jù)庫表空間,避免表空間不足導致數(shù)據(jù)存儲失敗
– 定期備份數(shù)據(jù),確保數(shù)據(jù)的完整性和安全性
6. 配置異地容災
數(shù)據(jù)庫的異地容災是保障穩(wěn)定運行的重要手段,可確保數(shù)據(jù)可用性和業(yè)務連續(xù)性。通過異地容災可以使數(shù)據(jù)庫在出現(xiàn)災難或數(shù)據(jù)異常的情況下,快速實現(xiàn)數(shù)據(jù)恢復,保證業(yè)務的可高可用性。在配置容災時,需要重點考慮以下幾點:
– 需要根據(jù)業(yè)務特點和需求,選擇合適的地理位置
– 需要在設計時論證和評估容災方案。
– 需要對容災方案進行定期維護和檢測,并進行必要的調整和優(yōu)化。
7. 監(jiān)測和故障排除
數(shù)據(jù)庫管理面臨的更大挑戰(zhàn)是應對各種故障,提升數(shù)據(jù)庫的條件,保障數(shù)據(jù)庫的高可用性。為了快速發(fā)現(xiàn)和排除問題,需要建立合理有效的監(jiān)控系統(tǒng),并針對常見問題提前做好預防措施。常見的故障問題包括:
– 數(shù)據(jù)庫過載
– 網(wǎng)絡中斷
– 文件系統(tǒng)錯誤
– 數(shù)據(jù)庫軟件錯誤
– 語句錯誤
在數(shù)據(jù)庫管理中,你需要通過不斷的經(jīng)驗積累和技能深化,保證數(shù)據(jù)庫的高效穩(wěn)定運行,為業(yè)務提供高品質的支持和服務。以上是優(yōu)化數(shù)據(jù)庫的7個技巧,只有綜合應用和靈活運用,方能有效保障數(shù)據(jù)庫的可靠性。
相關問題拓展閱讀:
- 誰知道數(shù)據(jù)庫優(yōu)化設計方案有哪些?
誰知道數(shù)據(jù)庫優(yōu)化設計方案有哪些?
系統(tǒng)優(yōu)化,加內存
本文首先討論了基于第三范式的數(shù)據(jù)庫表的基本設計,著重論述了建立主鍵和索引的策略和方案,然后從數(shù)據(jù)庫表的擴展設計和庫表對象的放置等角度概述了數(shù)據(jù)庫管理系統(tǒng)的優(yōu)化方案。
關鍵詞: 優(yōu)化(Optimizing) 第三范式(3NF) 冗余數(shù)據(jù)(Redundant Data) 索引(Index) 數(shù)據(jù)分割(Data Partitioning) 對象放置(Object Placement)
1 引言
數(shù)據(jù)庫優(yōu)化的目標無非是避免磁盤I/O瓶頸、減少CPU利用率和減少資源競爭。為了便于讀者閱讀和理解,筆者參閱了Sybase、Informix和Oracle等大型數(shù)據(jù)庫系統(tǒng)參考資料,基于多年的工程實踐經(jīng)驗,從基本表設計、擴展設計和數(shù)據(jù)庫表對象放置等角度進行討論,著重討論了如何避免磁盤I/O瓶頸和減少資源競爭,相信讀者會一目了然。
2 基于第三范式的基本表設計
在基于表驅動的信息管理系統(tǒng)(MIS)中,基本表的設計規(guī)范是第三范式(3NF)。第三范式的基本特征是非主鍵屬性只依賴于主鍵屬性。基于第三范式的數(shù)據(jù)庫表設計具有很多優(yōu)點:一是消除了冗余數(shù)據(jù),節(jié)省了磁盤存儲空間;二是有良好的數(shù)據(jù)完整性限制,即基于主外鍵的參照完整限制和基于主鍵的實體完整性限制,這使得數(shù)據(jù)容易維護,也容易移植和更新;三是數(shù)據(jù)的可逆性好,在做連接(Join)查詢或者合并表時不遺漏、也不重復;四是因消除了冗余數(shù)據(jù)(冗余列),在查詢(Select)時每個數(shù)據(jù)頁存的數(shù)據(jù)行就多,這樣就有效地減少了邏輯I/O,每個Cash存的頁面就多,也減少物理I/O;五是對大多數(shù)事務(Transaction)而言,運行性能好;六是物理設計(Physical Design)的機動性較大,能滿足日益增長的用戶需求。
在基本表設計中,表的主鍵、外鍵、索引設計占有非常重要的地位,但系統(tǒng)設計人員往往只注重于滿足用戶要求,而沒有從系統(tǒng)優(yōu)化的高度來認識和重視它們。實際上,它們與系統(tǒng)的運行性能密切相關?,F(xiàn)在從系統(tǒng)數(shù)據(jù)庫優(yōu)化角度討論這些基本概念及其重要意義:
(1)主鍵(Primary Key):主鍵被用于復雜的SQL語句時,頻繁地在數(shù)據(jù)訪問中被用到。一個表只有一個主鍵。主鍵應該有固定值(不能為Null或缺省值,要有相對穩(wěn)定性),不含代碼信息,易訪問。把常用(眾所周知)的列作為主鍵才有意義。短主鍵更佳(小于25bytes),主鍵的長短影響索引的大小,索引的大小影響索引頁的大小,從而影響磁盤I/O。主鍵分為自然主鍵和人為主鍵。自然主鍵由實體的屬性構成,自然主鍵可以是復合性的,在形成復合主鍵時,主鍵列不能太多,復合主鍵使得Join*作復雜化、也增加了外鍵表的大小。人為主鍵是,在沒有合適的自然屬性鍵、或自然屬性復雜或靈敏度高時,人為形成的。人為主鍵一般是整型值(滿足最小化要求),沒有實際意義,也略微增加了表的大??;但減少了把它作為外鍵的表的大小。
(2)外鍵(Foreign Key):外鍵的作用是建立關系型數(shù)據(jù)庫中表之間的關系(參照完整性),主鍵只能從獨立的實體遷移到非獨立的實體,成為后者的一個屬性,被稱為外鍵。
(3)索引(Index):利用索引優(yōu)化系統(tǒng)性能是顯而易見的,對所有常用于查詢中的Where子句的列和所有用于排序的列創(chuàng)建索引,可以避免整表掃描或訪問,在不改變表的物理結構的情況下,直接訪問特定的數(shù)據(jù)列,這樣減少數(shù)據(jù)存取時間;利用索引可以優(yōu)化或排除耗時的分類*作;把數(shù)據(jù)分散到不同的頁面上,就分散了插入的數(shù)據(jù);主鍵自動建立了唯一索引,因此唯一索引也能確保數(shù)據(jù)的唯一性(即實體完整性);索引碼越小,定位就越直接;新建的索引效能更好,因此定期更新索引非常必要。索引也有代價:有空間開銷,建立它也要花費時間,在進行Insert、Delete和Update*作時,也有維護代價。索引有兩種:聚族索引和非聚族索引。一個表只能有一個聚族索引,可有多個非聚族索引。使用聚族索引查詢數(shù)據(jù)要比使用非聚族索引快。在建索引前,應利用數(shù)據(jù)庫系統(tǒng)函數(shù)估算索引的大小。
① 聚族索引(Clustered Index):聚族索引的數(shù)據(jù)頁按物理有序儲存,占用空間小。選擇策略是,被用于Where子句的列:包括范圍查詢、模糊查詢或高度重復的列(連續(xù)磁盤掃描);被用于連接Join*作的列;被用于Order by和Group by子句的列。聚族索引不利于插入*作,另外沒有必要用主鍵建聚族索引。
② 非聚族索引(Nonclustered Index):與聚族索引相比,占用空間大,而且效率低。選擇策略是,被用于Where子句的列:包括范圍查詢、模糊查詢(在沒有聚族索引時)、主鍵或外鍵列、點(指針類)或小范圍(返回的結果域小于整表數(shù)據(jù)的20%)查詢;被用于連接Join*作的列、主鍵列(范圍查詢);被用于Order by和Group by子句的列;需要被覆蓋的列。對只讀表建多個非聚族索引有利。索引也有其弊端,一是創(chuàng)建索引要耗費時間,二是索引要占有大量磁盤空間,三是增加了維護代價(在修改帶索引的數(shù)據(jù)列時索引會減緩修改速度)。那么,在哪種情況下不建索引呢?對于小表(數(shù)據(jù)小于5頁)、小到中表(不直接訪問單行數(shù)據(jù)或結果集不用排序)、單值域(返回值密集)、索引列值太長(大于20bitys)、容易變化的列、高度重復的列、Null值列,對沒有被用于Where子語句和Join查詢的列都不能建索引。另外,對主要用于數(shù)據(jù)錄入的,盡可能少建索引。當然,也要防止建立無效索引,當Where語句中多于5個條件時,維護索引的開銷大于索引的效益,這時,建立臨時表存儲有關數(shù)據(jù)更有效。
批量導入數(shù)據(jù)時的注意事項:在實際應用中,大批量的計算(如電信話單計費)用C語言程序做,這種基于主外鍵關系數(shù)據(jù)計算而得的批量數(shù)據(jù)(文本文件),可利用系統(tǒng)的自身功能函數(shù)(如Sybase的BCP命令)快速批量導入,在導入數(shù)據(jù)庫表時,可先刪除相應庫表的索引,這有利于加快導入速度,減少導入時間。在導入后再重建索引以便優(yōu)化查詢。
(4)鎖:鎖是并行處理的重要機制,能保持數(shù)據(jù)并發(fā)的一致性,即按事務進行處理;系統(tǒng)利用鎖,保證數(shù)據(jù)完整性。因此,我們避免不了死鎖,但在設計時可以充分考慮如何避免長事務,減少排它鎖時間,減少在事務中與用戶的交互,杜絕讓用戶控制事務的長短;要避免批量數(shù)據(jù)同時執(zhí)行,尤其是耗時并用到相同的數(shù)據(jù)表。鎖的征用:一個表同時只能有一個排它鎖,一個用戶用時,其它用戶在等待。若用戶數(shù)增加,則Server的性能下降,出現(xiàn)“假死”現(xiàn)象。如何避免死鎖呢?從頁級鎖到行級鎖,減少了鎖征用;給小表增加無效記錄,從頁級鎖到行級鎖沒有影響,若在同一頁內競爭有影響,可選擇合適的聚族索引把數(shù)據(jù)分配到不同的頁面;創(chuàng)建冗余表;保持事務簡短;同一批處理應該沒有網(wǎng)絡交互。
(5)查詢優(yōu)化規(guī)則:在訪問數(shù)據(jù)庫表的數(shù)據(jù)(Access Data)時,要盡可能避免排序(Sort)、連接(Join)和相關子查詢*作。經(jīng)驗告訴我們,在優(yōu)化查詢時,必須做到:
① 盡可能少的行;
② 避免排序或為盡可能少的行排序,若要做大量數(shù)據(jù)排序,更好將相關數(shù)據(jù)放在臨時表中*作;用簡單的鍵(列)排序,如整型或短字符串排序;
③ 避免表內的相關子查詢;
④ 避免在Where子句中使用復雜的表達式或非起始的子字符串、用長字符串連接;
⑤ 在Where子句中多使用“與”(And)連接,少使用“或”(Or)連接;
⑥ 利用臨時數(shù)據(jù)庫。在查詢多表、有多個連接、查詢復雜、數(shù)據(jù)要過濾時,可以建臨時表(索引)以減少I/O。但缺點是增加了空間開銷。
除非每個列都有索引支持,否則在有連接的查詢時分別找出兩個動態(tài)索引,放在工作表中重新排序。
3 基本表擴展設計
基于第三范式設計的庫表雖然有其優(yōu)越性(見本文之一部分),然而在實際應用中有時不利于系統(tǒng)運行性能的優(yōu)化:如需要部分數(shù)據(jù)時而要掃描整表,許多過程同時競爭同一數(shù)據(jù),反復用相同行計算相同的結果,過程從多表獲取數(shù)據(jù)時引發(fā)大量的連接*作,當數(shù)據(jù)來源于多表時的連接*作;這都消耗了磁盤I/O和CPU時間。
尤其在遇到下列情形時,我們要對基本表進行擴展設計:許多過程要頻繁訪問一個表、子集數(shù)據(jù)訪問、重復計算和冗余數(shù)據(jù),有時用戶要求一些過程優(yōu)先或低的響應時間。
如何避免這些不利因素呢?根據(jù)訪問的頻繁程度對相關表進行分割處理、存儲冗余數(shù)據(jù)、存儲衍生列、合并相關表處理,這些都是克服這些不利因素和優(yōu)化系統(tǒng)運行的有效途徑。
3.1 分割表或儲存冗余數(shù)據(jù)
分割表分為水平分割表和垂直分割表兩種。分割表增加了維護數(shù)據(jù)完整性的代價。
水平分割表:一種是當多個過程頻繁訪問數(shù)據(jù)表的不同行時,水平分割表,并消除新表中的冗余數(shù)據(jù)列;若個別過程要訪問整個數(shù)據(jù),則要用連接*作,這也無妨分割表;典型案例是電信話單按月分割存放。另一種是當主要過程要重復訪問部分行時,更好將被重復訪問的這些行單獨形成子集表(冗余儲存),這在不考慮磁盤空間開銷時顯得十分重要;但在分割表以后,增加了維護難度,要用觸發(fā)器立即更新、或存儲過程或應用代碼批量更新,這也會增加額外的磁盤I/O開銷。
垂直分割表(不破壞第三范式),一種是當多個過程頻繁訪問表的不同列時,可將表垂直分成幾個表,減少磁盤I/O(每行的數(shù)據(jù)列少,每頁存的數(shù)據(jù)行就多,相應占用的頁就少),更新時不必考慮鎖,沒有冗余數(shù)據(jù)。缺點是要在插入或刪除數(shù)據(jù)時要考慮數(shù)據(jù)的完整性,用存儲過程維護。另一種是當主要過程反復訪問部分列時,更好將這部分被頻繁訪問的列數(shù)據(jù)單獨存為一個子集表(冗余儲存),這在不考慮磁盤空間開銷時顯得十分重要;但這增加了重疊列的維護難度,要用觸發(fā)器立即更新、或存儲過程或應用代碼批量更新,這也會增加額外的磁盤I/O開銷。垂直分割表可以達到更大化利用Cache的目的。
總之,為主要過程分割表的方法適用于:各個過程需要表的不聯(lián)結的子集,各個過程需要表的子集,訪問頻率高的主要過程不需要整表。在主要的、頻繁訪問的主表需要表的子集而其它主要頻繁訪問的過程需要整表時則產(chǎn)生冗余子集表。
注意,在分割表以后,要考慮重新建立索引。
3.2 存儲衍生數(shù)據(jù)
對一些要做大量重復性計算的過程而言,若重復計算過程得到的結果相同(源列數(shù)據(jù)穩(wěn)定,因此計算結果也不變),或計算牽扯多行數(shù)據(jù)需額外的磁盤I/O開銷,或計算復雜需要大量的CPU時間,就考慮存儲計算結果(冗余儲存)。現(xiàn)予以分類說明:
若在一行內重復計算,就在表內增加列存儲結果。但若參與計算的列被更新時,必須要用觸發(fā)器更新這個新列。
若對表按類進行重復計算,就增加新表(一般而言,存放類和結果兩列就可以了)存儲相關結果。但若參與計算的列被更新時,就必須要用觸發(fā)器立即更新、或存儲過程或應用代碼批量更新這個新表。
若對多行進行重復性計算(如排名次),就在表內增加列存儲結果。但若參與計算的列被更新時,必須要用觸發(fā)器或存儲過程更新這個新列。
總之,存儲冗余數(shù)據(jù)有利于加快訪問速度;但違反了第三范式,這會增加維護數(shù)據(jù)完整性的代價,必須用觸發(fā)器立即更新、或存儲過程或應用代碼批量更新,以維護數(shù)據(jù)的完整性。
3.3 消除昂貴結合
對于頻繁同時訪問多表的一些主要過程,考慮在主表內存儲冗余數(shù)據(jù),即存儲冗余列或衍生列(它不依賴于主鍵),但破壞了第三范式,也增加了維護難度。在源表的相關列發(fā)生變化時,必須要用觸發(fā)器或存儲過程更新這個冗余列。當主要過程總同時訪問兩個表時可以合并表,這樣可以減少磁盤I/O*作,但破壞了第三范式,也增加了維護難度。對父子表和1:1關系表合并方法不同:合并父子表后,產(chǎn)生冗余表;合并1:1關系表后,在表內產(chǎn)生冗余數(shù)據(jù)。
4 數(shù)據(jù)庫對象的放置策略
數(shù)據(jù)庫對象的放置策略是均勻地把數(shù)據(jù)分布在系統(tǒng)的磁盤中,平衡I/O訪問,避免I/O瓶頸。
⑴ 訪問分散到不同的磁盤,即使用戶數(shù)據(jù)盡可能跨越多個設備,多個I/O運轉,避免I/O競爭,克服訪問瓶頸;分別放置隨機訪問和連續(xù)訪問數(shù)據(jù)。
⑵ 分離系統(tǒng)數(shù)據(jù)庫I/O和應用數(shù)據(jù)庫I/O。把系統(tǒng)審計表和臨時庫表放在不忙的磁盤上。
⑶ 把事務日志放在單獨的磁盤上,減少磁盤I/O開銷,這還有利于在障礙后恢復,提高了系統(tǒng)的安全性。
⑷ 把頻繁訪問的“活性”表放在不同的磁盤上;把頻繁用的表、頻繁做Join*作的表分別放在單獨的磁盤上,甚至把把頻繁訪問的表的字段放在不同的磁盤上,把訪問分散到不同的磁盤上,避免I/O爭奪;
⑸ 利用段分離頻繁訪問的表及其索引(非聚族的)、分離文本和圖像數(shù)據(jù)。段的目的是平衡I/O,避免瓶頸,增加吞吐量,實現(xiàn)并行掃描,提高并發(fā)度,更大化磁盤的吞吐量。利用邏輯段功能,分別放置“活性”表及其非聚族索引以平衡I/O。當然更好利用系統(tǒng)的默認段。另外,利用段可以使備份和恢復數(shù)據(jù)更加靈活,使系統(tǒng)授權更加靈活。
利用合理建表、索引、存儲過程。
●數(shù)據(jù)庫性能的優(yōu)化
一個數(shù)據(jù)庫系統(tǒng)的生命周期可以分成:設計、開發(fā)和成品三個階段。在設計階段進行數(shù)據(jù)庫性能優(yōu)化的成本更低,收益更大。在成品階段進行數(shù)據(jù)庫性能優(yōu)化的成本更高,收益最小。
數(shù)據(jù)庫的優(yōu)化通??梢酝ㄟ^對網(wǎng)絡、硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)和應用程序的優(yōu)化來進行。最常見的優(yōu)化手段就是對硬件的升級。根據(jù)統(tǒng)計,對網(wǎng)絡、硬件、操作系統(tǒng)、數(shù)據(jù)庫參數(shù)進行優(yōu)化所獲得的性能提升,全部加起來只占數(shù)據(jù)庫系統(tǒng)性能提升的40%左右,其余的60%系統(tǒng)性能提升來自對應用程序的優(yōu)化。許多優(yōu)化專家認為,對應用程序的優(yōu)化可以得到80%的系統(tǒng)性能的提升。
●應用程序的優(yōu)化
應用程序的優(yōu)化通??煞譃閮蓚€方面:源代碼和SQL語句。由于涉及到對程序邏輯的改變,源代碼的優(yōu)化在時間成本和風險上代價很高,而對數(shù)據(jù)庫系統(tǒng)性能的提升收效有限。
我陪你等,關注ing
如何優(yōu)化數(shù)據(jù)庫的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于如何優(yōu)化數(shù)據(jù)庫,優(yōu)化數(shù)據(jù)庫的7個技巧。,誰知道數(shù)據(jù)庫優(yōu)化設計方案有哪些?的信息別忘了在本站進行查找喔。
成都服務器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務器和獨立服務器。物理服務器托管租用:四川成都、綿陽、重慶、貴陽機房服務器托管租用。
本文標題:優(yōu)化數(shù)據(jù)庫的7個技巧。 (如何優(yōu)化數(shù)據(jù)庫)
本文網(wǎng)址:http://m.fisionsoft.com.cn/article/ccoeedj.html


咨詢
建站咨詢
