自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)庫分區(qū)分表以及讀寫分離

數(shù)據(jù)庫
Oracle數(shù)據(jù)庫分區(qū)是作為Oracle數(shù)據(jù)庫性能優(yōu)化的一種重要的手段和方法,做手頭的項(xiàng)目以前,只聆聽過分區(qū)的大名,感覺特神秘,看見某某高手在討論會上夸夸其談時(shí),真是罵自己學(xué)藝不精,最近作GPS方面的項(xiàng)目,處理的數(shù)據(jù)量達(dá)到了幾十GB,為了滿足系統(tǒng)的實(shí)時(shí)性要求,必須提高數(shù)據(jù)的查詢效率,這樣就必須通過分區(qū),以解燃眉之急!

Oracle數(shù)據(jù)庫分區(qū)是作為Oracle數(shù)據(jù)庫性能優(yōu)化的一種重要的手段和方法,做手頭的項(xiàng)目以前,只聆聽過分區(qū)的大名,感覺特神秘,看見某某高手在討論會上夸夸其談時(shí),真是罵自己學(xué)藝不精,最近作GPS方面的項(xiàng)目,處理的數(shù)據(jù)量達(dá)到了幾十GB,為了滿足系統(tǒng)的實(shí)時(shí)性要求,必須提高數(shù)據(jù)的查詢效率,這樣就必須通過分區(qū),以解燃眉之急!

先說說分區(qū)的好處吧!

1) 增強(qiáng)可用性:如果表的某個(gè)分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;

2) 維護(hù)方便:如果表的某個(gè)分區(qū)出現(xiàn)故障,需要修復(fù)數(shù)據(jù),只修復(fù)該分區(qū)即可;

3) 均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個(gè)系統(tǒng)性能;

4) 改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關(guān)心的分區(qū),提高檢索速度。

Oracle數(shù)據(jù)庫提供對表或索引的分區(qū)方法有三種:

ü 范圍分區(qū)

ü Hash分區(qū)(散列分區(qū))

ü 復(fù)合分區(qū)

一、范圍分區(qū)詳細(xì)說明

范圍分區(qū)就是對數(shù)據(jù)表中的某個(gè)值的范圍進(jìn)行分區(qū),根據(jù)某個(gè)值的范圍,決定將該數(shù)據(jù)存儲在哪個(gè)分區(qū)上。如根據(jù)序號分區(qū),根據(jù)時(shí)間等來進(jìn)行分區(qū)。根據(jù)序號,比如小于2000000的放在part01, 2000000~4000000的放在part02。。。

  1. create table AAA 
  2.  id number primary key
  3.  indate date not null 
  4. partition by range(indate) 
  5.  partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd'))tablespace space01, 
  6.  partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd'))tablespace space02, 
  7.  partition part_03 values less than(maxvalue)tablespace space03 
  8. );  

space01\ space02\ space03為建立的三個(gè)表空間,相當(dāng)于把建立的一個(gè)大的表分在了3個(gè)不同的表空間的分區(qū)上了。

二、Hash分區(qū)(散列分區(qū))詳細(xì)說明

散列分區(qū)為通過指定分區(qū)編號來均勻分布數(shù)據(jù)的一種分區(qū)類型,因?yàn)橥ㄟ^在I/O設(shè)備上進(jìn)行散列分區(qū),使得這些分區(qū)大小一致。也就是只命名分區(qū)名稱,這樣均勻進(jìn)行數(shù)據(jù)分布。

三、復(fù)合分區(qū)詳細(xì)說明

有時(shí)候我們需要根據(jù)范圍分區(qū)后,每個(gè)分區(qū)內(nèi)的數(shù)據(jù)再散列地分布在幾個(gè)表空間中,這樣我們就要使用復(fù)合分區(qū)。復(fù)合分區(qū)是先使用范圍分區(qū),然后在每個(gè)分區(qū)內(nèi)再使用散列分區(qū)的一種分區(qū)方法。

  1. partition by range(indate)subpartition by hash(id)  
  2. subpartitions 3 store in (space01, space02, space03)  
  3. (  
  4. partition part_01 values less than(to_date(’2006-01-01’,’yyyy-mm-dd’)),  
  5. partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’)),  
  6. partition part_03 values less than(maxvalue)  
  7.  );  

四、分區(qū)表操作

1、插入記錄:insert into AAA values(1 ,sysdate);

2、查詢分區(qū)表記錄:select * from AAA partition(part_01);

3、更新分區(qū)表的記錄:update AAA partition(part_01) t set indate=’’where id=1; 但是當(dāng)更新的時(shí)候指定了分區(qū),而根據(jù)查詢的記錄不在該分區(qū)中時(shí),將不會更新數(shù)據(jù)

4、刪除分區(qū)表記錄:delete from AAA partition(part_02) t where id=4; 如果指定了分區(qū),而條件中的數(shù)據(jù)又不在該分區(qū)中時(shí),將不會刪除任何數(shù)據(jù)。

5、增加一個(gè)分區(qū):alter table AAA add partition part_04 values less than(to_date(’2012-01-01’,’yyyy-mm-dd’)) tablespace dinya_spa ce03; 增加一個(gè)分區(qū)的時(shí)候,增加的分區(qū)的條件必須大于現(xiàn)有分區(qū)的最大值,否則系統(tǒng)將提示ORA-14074 partition bound must collate higher than that of the last partition 錯(cuò)誤。

6、合并一個(gè)分區(qū):alter table AAA merge partitions part_01,part_02 into partition part_02; ,如果在合并的時(shí)候把合并后的分區(qū)定為part_01的時(shí)候,系統(tǒng)將提示ORA-14275 cannot reuse lower-bound partition as resulting partition 錯(cuò)誤。

7、刪除分區(qū):alter table AAA drop partition part_01; 刪除分區(qū)表的一個(gè)分區(qū)后,查詢該表的數(shù)據(jù)時(shí)顯示,該分區(qū)中的數(shù)據(jù)已全部丟失,所以執(zhí)行刪除分區(qū)動(dòng)作時(shí)要慎重,確保先備份數(shù)據(jù)后再執(zhí)行,或?qū)⒎謪^(qū)合并。

五、建立索引

分區(qū)表和一般表一樣可以建立索引,分區(qū)表可以創(chuàng)建局部索引和全局索引。當(dāng)分區(qū)中出現(xiàn)許多事務(wù)并且要保證所有分區(qū)中的數(shù)據(jù)記錄的唯一性時(shí)采用全局索引。

1. 局部索引分區(qū)的建立: 

  1. create index idx_t on AAA(id) 
  2.  
  3. local 
  4.  
  5.  
  6. partition idx_1 tablespace space01, 
  7.  
  8. partition idx_2 tablespace space02, 
  9.  
  10. partition idx_3 tablespace space03 
  11.  
  12. );  

2. 全局索引建立時(shí)global 子句允許指定索引的范圍值,這個(gè)范圍值為索引字段的范圍值:

  1. create index idx_t on AAA(id) 
  2.  
  3. global partition by range(id) 
  4.  
  5.  
  6. partition idx_1 values less than (1000) tablespace space01, 
  7.  
  8. partition idx_2 values less than (10000) tablespace space02, 
  9.  
  10. partition idx_3 values less than (maxvalue) tablespace space03 
  11.  
  12. );  

當(dāng)然也可以不指定索引分區(qū)名直接對整個(gè)表建立索引:

  1. create index idx_t on AAA(id); 

數(shù)據(jù)庫的垂直切分和水平切分

數(shù)據(jù)切分可以是物理上的,對數(shù)據(jù)通過一系列的切分規(guī)則將數(shù)據(jù)分布到不同的DB服務(wù)器上,通過路由規(guī)則路由訪問特定的數(shù)據(jù)庫,這樣一來每次訪問面對的就不是單臺服務(wù)器了,而是N臺服務(wù)器,這樣就可以降低單臺機(jī)器的負(fù)載壓力。

數(shù)據(jù)切分也可以是數(shù)據(jù)庫內(nèi)的,對數(shù)據(jù)通過一系列的切分規(guī)則,將數(shù)據(jù)分布到一個(gè)數(shù)據(jù)庫的不同表中,比如將article分為article_001,article_002等子表,若干個(gè)子表水平拼合有組成了邏輯上一個(gè)完整的article表,這樣做的目的其實(shí)也是很簡單的。 舉個(gè)例子說明,比如article表中現(xiàn)在有5000w條數(shù)據(jù),此時(shí)我們需要在這個(gè)表中增加(insert)一條新的數(shù)據(jù),insert完畢后,數(shù)據(jù)庫會針對這張表重新建立索引,5000w行數(shù)據(jù)建立索引的系統(tǒng)開銷還是不容忽視的。但是反過來,假如我們將這個(gè)表分成100 個(gè)table呢,從article_001一直到article_100,5000w行數(shù)據(jù)平均下來,每個(gè)子表里邊就只有50萬行數(shù)據(jù),這時(shí)候我們向一張只有50w行數(shù)據(jù)的table中insert數(shù)據(jù)后建立索引的時(shí)間就會呈數(shù)量級的下降,極大了提高了DB的運(yùn)行時(shí)效率,提高了DB的并發(fā)量。當(dāng)然分表的好處還不知這些,還有諸如寫操作的鎖操作等,都會帶來很多顯然的好處。

綜上,分庫降低了單點(diǎn)機(jī)器的負(fù)載;分表,提高了數(shù)據(jù)操作的效率,尤其是Write操作的效率。  

 

 

數(shù)據(jù)庫的讀寫分離

讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。

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

單表的數(shù)據(jù)量限制,當(dāng)單表數(shù)據(jù)量到一定條數(shù)之后數(shù)據(jù)庫性能會顯著下降。數(shù)據(jù)多了之后,對數(shù)據(jù)庫的讀、寫就會很多。分庫減少單臺數(shù)據(jù)庫的壓力。接觸過幾個(gè)分庫分表的系統(tǒng),都是通過主鍵進(jìn)行散列分褲分表的。這類數(shù)據(jù)比較特殊,主鍵就是唯一的獲取該條信息的主要途徑。比如:京東的訂單、財(cái)付通的交易記錄等。。。該類數(shù)據(jù)的用法,就是通過訂單號、交易號來查詢該筆訂單、交易。

還有一類數(shù)據(jù),比如用戶信息,每個(gè)用戶都有系統(tǒng)內(nèi)部的一個(gè)userid,與userid對應(yīng)的還有用戶看到的登錄名。那么如果分庫分表的時(shí)候單純通過userid進(jìn)行散列分庫,那么根據(jù)登錄名來獲取用戶的信息,就無法知道該用戶處于哪個(gè)數(shù)據(jù)庫中。

或許有朋友會說,我們可以維護(hù)一個(gè)email----userid的映射關(guān)系,根據(jù)email先查詢到userid,在根據(jù)userid的分庫分表規(guī)則到對應(yīng)庫的對應(yīng)表來獲取用戶的記錄信息。這么做是可以的,但是這個(gè)映射關(guān)系的條數(shù)本身也是個(gè)瓶頸,原則上是沒有減少單表內(nèi)數(shù)據(jù)的條數(shù),算是一個(gè)單點(diǎn)。并且要維護(hù)這個(gè)映射關(guān)系和用戶信息的一致性(修改登錄名、多登錄名等其他特殊需求),最大一個(gè)原因,其實(shí)用戶信息是一個(gè)讀大于寫的庫,web2.0都是以用戶為中心,所有信息都和用戶信息相關(guān)聯(lián),所以對用戶信息拆分還是有一定局限性的。

對于這類讀大于寫并且數(shù)據(jù)量增加不是很明顯的數(shù)據(jù)庫,推薦采用讀寫分離+緩存的模式,試想一下一個(gè)用戶注冊、修改用戶信息、記錄用戶登錄時(shí)間、記錄用戶登錄IP、修改登錄密碼,這些是寫操作。但是以上這些操作次數(shù)都是很小的,所以整個(gè)數(shù)據(jù)庫的寫壓力是很小的。唯一一個(gè)比較大的就是記錄用戶登錄時(shí)間、記錄用戶登錄IP這類信息,只要把這些經(jīng)常變動(dòng)的信息排除在外,那么寫操作可以忽略不計(jì)。所以讀寫分離首要解決的就是經(jīng)常變化的數(shù)據(jù)的拆分,比如:用戶登錄時(shí)間、記錄用戶登錄IP。這類信息可以單獨(dú)獨(dú)立出來,記錄在持久化類的緩存中(可靠性要求并不高,登陸時(shí)間、IP丟了就丟了,下次來了就又來了)

以oracle為例,主庫負(fù)責(zé)寫數(shù)據(jù)、讀數(shù)據(jù)。讀庫僅負(fù)責(zé)讀數(shù)據(jù)。每次有寫庫操作,同步更新cache,每次讀取先讀cache在讀DB。寫庫就一個(gè),讀庫可以有多個(gè),采用dataguard來負(fù)責(zé)主庫和多個(gè)讀庫的數(shù)據(jù)同步。 

 

責(zé)任編輯:龐桂玉 來源: java版web項(xiàng)目
相關(guān)推薦

2020-01-03 16:30:14

數(shù)據(jù)庫讀寫分離分庫

2022-12-05 07:51:24

數(shù)據(jù)庫分庫分表讀寫分離

2022-12-15 09:44:29

數(shù)據(jù)庫利器

2018-10-16 16:45:05

數(shù)據(jù)庫讀寫分離

2018-02-24 19:37:33

Java8數(shù)據(jù)庫中間件

2024-09-20 07:38:00

數(shù)據(jù)庫性能策略

2020-03-24 14:16:18

ProxySQLMySQL數(shù)據(jù)庫

2018-01-15 05:54:45

數(shù)據(jù)庫讀寫分離互聯(lián)網(wǎng)

2018-01-09 18:46:44

數(shù)據(jù)庫架構(gòu)讀寫分離

2020-05-26 10:42:31

數(shù)據(jù)庫讀寫分離數(shù)據(jù)庫架構(gòu)

2022-05-05 10:00:53

Kafka分區(qū)分配Linux

2018-05-14 16:14:56

數(shù)據(jù)庫MySQL分表與分區(qū)

2025-04-22 09:31:52

2011-08-10 16:30:36

數(shù)據(jù)庫表分區(qū)表分割

2020-09-07 07:36:32

數(shù)據(jù)庫集群程序員

2022-02-23 09:17:09

數(shù)據(jù)庫分離變更

2011-07-20 16:03:06

SQL Server數(shù)分區(qū)表

2010-09-10 13:37:30

表分區(qū)SQL Server

2019-01-29 14:55:50

數(shù)據(jù)庫中間件分庫分表

2009-07-07 16:39:33

JSP數(shù)據(jù)庫配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號