資料庫結構的優化有多種方法

2022-10-10 09:51:11 字數 2904 閱讀 6298

1.建立索引

2.使用儲存過程 ,減少sql語句解析編譯的過程

3.使用資料庫分割槽 減少查詢量

4.水平垂直拆分 垂直 是業務一般業務拆分, 水平 一般是數量拆分

5.oralce物化檢視  相當於中間表

資料庫 分割槽的好處:

1) 增強可用性:如果表的某個分割槽出現故障,表在其他分割槽的資料仍然可用;

2) 維護方便:如果表的某個分割槽出現故障,需要修復資料,只修復該分割槽即可;

3) 均衡i/o:可以把不同的分割槽對映到磁碟以平衡i/o,改善整個系統效能;

4) 改善查詢效能:對分割槽物件的查詢可以僅搜尋自己關心的分割槽,提高檢索速度。

水平表分割槽和垂直表分割槽。

水平分割槽:目的是將乙個表分為多個表。每個表包含的列數(表字段)都是相同的,但是記錄數(資料行)會減少。比如,我們可以將乙個包含1億行記錄的資料庫表,按照水平分割槽的方式,分成12個小表,每個小表分別表示這一年份內從1月到12月的資料。這樣,任何需要查詢特定月份資料的查詢只需查詢相應月份的表,而避免從儲存在1個大表中的所有月份的資料進行查詢。根據sql語句的執行效率,毫無疑問,從小表中的查詢效率會遠遠高於從大表中查詢的效率。

垂直分割槽:該方式則與水平分割槽方式相反,從縱向進行分割槽,是將乙個原始表分成多個只包含較少列的表。在日常的應用中,水平分割槽可以說是最常用的分割槽方式。

1、partition 技術介紹

oracle的分割槽是一種處理超大型表、索引等的技術。通過將大表和索引按照分割槽規則分成可以管理的若干小塊,從而避免了對每個表作為乙個大的、單獨的物件進行管理,為大量資料提供了可伸縮的效能。分割槽通過將操作分配給更小的儲存單元,減少了需要進行管理操作的時間,並通過增強的並行處理提高了效能,通過遮蔽故障資料的分割槽,還增加了可用性。

2、資料庫分割槽設計優化方案

2.1確定哪些大表需要進行分割槽:

使用分割槽技術時,並不是對資料庫中的所有表都進行分割槽,而只針對資料量比較大的一些大表才進行分割槽。根據分割槽的定義可知:分割槽其實就是將乙個大資料段按規則劃分成若干個小資料段,如果表物件本身很小,就失去了分割槽的意義。根據經驗,資料量大於1000萬的表才需要做分割槽。

2.2討論分割槽型別及分割槽欄位的選擇:

這一步至關重要,分割槽型別和分割槽欄位的選擇嚴重影響到資料表的訪問效能。選擇了錯誤的分割槽型別或分割槽欄位給資料庫效能帶來的負面影響會比不做分割槽更大,因此在決定分割槽型別和分割槽欄位時一定要與專案組討論,按照業務需求及業務邏輯共同制定。

根據經驗,選擇分割槽型別的步驟:

1)先確定該表中哪個欄位在select語句的謂詞中使用最頻繁,此字段將做為分割槽字段。

因為分割槽的目的是將乙個大表的資料段按規則分離成若干個小資料段,索引也分離為若干小索引段,在資料訪問時,根據索引只需要訪問其中的乙個小索引段,最後訪問其中的乙個資料段,從而減小了需要訪問的資料量,達到優化的目的。如果select語句的謂詞中不包括分割槽字段,則必須訪問完整個索引段,最後訪問所有的小資料段,才能定位出需要訪問的資料。

2)根據分割槽欄位的特點,確定分割槽型別。

如果該字段有明確的順序先後關係,則該錶合適做範圍分割槽。如:時間,如果該欄位沒有明確的範圍順序關係,則是具有唯一值或若干值,則該錶合適做列表分割槽。如:部門、分公司,如果該字段既無明確的範圍順序關係,也無具體值,而是些流水號,則該錶合適做雜湊分割槽。如:批處理號、流水號。

2.3資料表空間及索引表空間設計

表物件和索引物件的第乙個規則是把表和索引分離。把錶和相應的索引建立在不同的表空間中,最好在不同的磁碟上。這樣可以避免在資料管理和查詢時出現的許多i/o衝突。

在此優化方案中,我們將為每個分割槽建立乙個對應的表空間,讓表分割槽存放在不同的表空間中,達到不同分區間資料訪問的分離。同時為每個索引分割槽也建立獨立的索引分割槽表空間。

資料庫的讀寫分離

讀寫分離,基本的原理是讓主資料庫處理事務性增、改、刪操作(insert、update、delete),而從資料庫處理select查詢操作。資料庫複製被用來把事務性操作導致的變更同步到集群中的從資料庫。

為什麼要分庫、分表、讀寫分?

單錶的資料量限制,當單錶資料量到一定條數之後資料庫效能會顯著下降。資料多了之後,對資料庫的讀、寫就會很多。分庫減少單台資料庫的壓力。接觸過幾個分庫分表的系統,都是通過主鍵進行雜湊分褲分表的。這類資料比較特殊,主鍵就是唯一的獲取該條資訊的主要途徑。比如:京東的訂單、財付通的交易記錄等。。。該類資料的用法,就是通過訂單號、交易號來查詢該筆訂單、交易。

還有一類資料,比如使用者資訊,每個使用者都有系統內部的乙個userid,與userid對應的還有使用者看到的登入名。那麼如果分庫分表的時候單純通過userid進行雜湊分庫,那麼根據登入名來獲取使用者的資訊,就無法知道該使用者處於哪個資料庫中。

或許有朋友會說,我們可以維護乙個email----userid的對映關係,根據email先查找到userid,在根據userid的分庫分表規則到對應庫的對應表來獲取使用者的記錄資訊。這麼做是可以的,但是這個對映關係的條數本身也是個瓶頸,原則上是沒有減少單錶內資料的條數,算是乙個單點。並且要維護這個對映關係和使用者資訊的一致性(修改登入名、多登入名等其他特殊需求),最大乙個原因,其實使用者資訊是乙個讀大於寫的庫,web2.0都是以使用者為中心,所有資訊都和使用者資訊相關聯,所以對使用者資訊拆分還是有一定侷限性的。

對於這類讀大於寫並且資料量增加不是很明顯的資料庫,推薦採用讀寫分離+快取的模式,試想一下乙個使用者註冊、修改使用者資訊、記錄使用者登入時間、記錄使用者登入ip、修改登入密碼,這些是寫操作。但是以上這些操作次數都是很小的,所以整個資料庫的寫壓力是很小的。唯一乙個比較大的就是記錄使用者登入時間、記錄使用者登入ip這類資訊,只要把這些經常變動的資訊排除在外,那麼寫操作可以忽略不計。所以讀寫分離首要解決的就是經常變化的資料的拆分,比如:使用者登入時間、記錄使用者登入ip。這類資訊可以單獨獨立出來,記錄在持久化類的快取中(可靠性要求並不高,登陸時間、ip丟了就丟了,下次來了就又來了)

以oracle為例,主庫負責寫資料、讀資料。讀庫僅負責讀資料。每次有寫庫操作,同步更新cache,每次讀取先讀cache在讀db。寫庫就乙個,讀庫可以有多個,採用dataguard來負責主庫和多個讀庫的資料同步。

《優化資料庫的幾種方法》

優化資料庫的幾種方法 一 選取最適用的字段屬性 1 myspl可以很好地支援大量資料的訪問,但是一般來說,資料庫上的表越小,在它上面執行查詢也就越快。因此,在建立表的時候,為了獲得更好的效能,我們需要將表中的字段寬度設定盡可能小。2 盡量把字段設定為not null,這樣將來進行查詢的時候就不需要比...

啟動 關閉Oracle資料庫的多種方法

啟動和關閉oracle有很多種方法。這裡只給出3種方法 l sql plus l oem控制台 l windows 控制台 1.以sql plus為例 a.準備 首先我們用sql plus來連線到oracle sqlplus nolog 是以不連線資料庫的方式啟動sql plus connect a...

mysql設定遠端訪問資料庫的多種方法

問題 mysql許可權設定正確,但仍無法遠端訪問。通過telnet發現3306埠未開啟。分析 mysql預設只繫結127.0.0.1,即 只有在本機才能訪問3306埠。解決 找到mysql配置檔案,搜尋 bind address 找到這一行 bind address 127.0.0.1 在前面加乙個...