當前位置:首頁 » 存儲配置 » 資料庫存儲與分區

資料庫存儲與分區

發布時間: 2024-07-05 21:46:00

資料庫分區的分類

分區主要有兩種形式://這里一定要注意行和列的概念(row是行,column是列)
水平分區(Horizontal Partitioning)
這種形式分區是對表的行進行分區,通過這樣的方式不同分組裡面的物理列分割的數據集得以組合,從而進行個體分割(單分區)或集體分割(1個或多個分區)。所有在表中定義的列在每個數據集中都能找到,所以表的特性依然得以保持。
舉個簡單例子:一個包含十年發票記錄的表可以被分區為十個不同的分區,每個分區包含的是其中一年的記錄。(朋奕註:這里具體使用的分區方式我們後面再說,可以先說一點,一定要通過某個屬性列來分割,譬如這里使用的列就是年份)
垂直分區(Vertical Partitioning)
這種分區方式一般來說是通過對表的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分區,每個分區都包含了其中的列所對應的行。
舉個簡單例子:一個包含了大text和BLOB列的表,這些text和BLOB列又不經常被訪問,這時候就要把這些不經常使用的text和BLOB了劃分到另一個分區,在保證它們數據相關性的同時還能提高訪問速度。
在資料庫供應商開始在他們的資料庫引擎中建立分區(主要是水平分區)時,DBA和建模者必須設計好表的物理分區結構,不要保存冗餘的數據(不同表中同時都包含父表中的數據)或相互聯結成一個邏輯父對象(通常是視圖)。這種做法會使水平分區的大部分功能失效,有時候也會對垂直分區產生影響。

⑵ 浠涔堟槸鍒嗚〃鍜屽垎鍖篗ysql鏁版嵁搴撳垎鍖哄拰鍒嗚〃鏂規硶



1銆佷負浠涔堣佸垎琛ㄥ拰鍒嗗尯

鏃ュ父寮鍙戜腑鎴戜滑緇忓父浼氶亣鍒板ぇ琛ㄧ殑鎯呭喌錛屾墍璋撶殑澶ц〃鏄鎸囧瓨鍌ㄤ簡鐧句竾綰т箖鑷沖崈涓囩駭鏉¤板綍鐨勮〃銆傝繖鏍風殑琛ㄨ繃浜庡簽澶э紝瀵艱嚧鏁版嵁搴撳湪鏌ヨ㈠拰鎻掑叆鐨勬椂鍊欒楁椂澶闀匡紝鎬ц兘浣庝笅錛屽傛灉娑夊強鑱斿悎鏌ヨ㈢殑鎯呭喌錛屾ц兘浼氭洿鍔犵碂緋曘傚垎琛ㄥ拰琛ㄥ垎鍖虹殑鐩鐨勫氨鏄鍑忓皯鏁版嵁搴撶殑璐熸媴錛屾彁楂樻暟鎹搴撶殑鏁堢巼錛岄氬父鐐規潵璁插氨鏄鎻愰珮琛ㄧ殑澧炲垹鏀規煡鏁堢巼銆

2銆佷粈涔堟槸鍒嗚〃鍜屽垎鍖

2.1 鍒嗚〃

鍒嗚〃鏄灝嗕竴涓澶ц〃鎸夌収涓瀹氱殑瑙勫垯鍒嗚В鎴愬氬紶鍏鋒湁鐙絝嬪瓨鍌ㄧ┖闂寸殑瀹炰綋琛錛屾垜浠鍙浠ョО涓哄瓙琛錛屾瘡涓琛ㄩ兘瀵瑰簲涓変釜鏂囦歡錛孧YD鏁版嵁鏂囦歡錛.MYI緔㈠紩鏂囦歡錛.frm琛ㄧ粨鏋勬枃浠躲傝繖浜涘瓙琛ㄥ彲浠ュ垎甯冨湪鍚屼竴鍧楃佺洏涓婏紝涔熷彲浠ュ湪涓嶅悓鐨勬満鍣ㄤ笂銆俛pp璇誨啓鐨勬椂鍊欐牴鎹浜嬪厛瀹氫箟濂界殑瑙勫垯寰楀埌瀵瑰簲鐨勫瓙琛ㄥ悕錛岀劧鍚庡幓鎿嶄綔瀹冦

2.2 鍒嗗尯

鍒嗗尯鍜屽垎琛ㄧ浉浼礆紝閮芥槸鎸夌収瑙勫垯鍒嗚В琛ㄣ備笉鍚屽湪浜庡垎琛ㄥ皢澶ц〃鍒嗚В涓鴻嫢騫蹭釜鐙絝嬬殑瀹炰綋琛錛岃屽垎鍖烘槸灝嗘暟鎹鍒嗘靛垝鍒嗗湪澶氫釜浣嶇疆瀛樻斁錛屽彲浠ユ槸鍚屼竴鍧楃佺洏涔熷彲浠ュ湪涓嶅悓鐨勬満鍣ㄣ傚垎鍖哄悗錛岃〃闈涓婅繕鏄涓寮犺〃錛屼絾鏁版嵁鏁e垪鍒板氫釜浣嶇疆浜嗐俛pp璇誨啓鐨勬椂鍊欐搷浣滅殑榪樻槸澶ц〃鍚嶅瓧錛宒b鑷鍔ㄥ幓緇勭粐鍒嗗尯鐨勬暟鎹銆
鍒嗗尯鐨勪富瑕佺洰鐨勬槸涓轟簡鍦ㄧ壒瀹氱殑SQL鎿嶄綔涓鍑忓皯鏁版嵁璇誨啓鐨勬婚噺浠ョ緝鍑忓搷搴旀椂闂淬

2.3 mysql鍒嗚〃鍜屽垎鍖烘湁浠涔堣仈緋誨憿錛

1錛夈侀兘鑳芥彁楂榤ysql鐨勬ц兘錛屽湪楂樺苟鍙戠姸鎬佷笅閮芥湁涓涓鑹濂界殑琛ㄧ幇銆
2錛夈佸垎琛ㄥ拰鍒嗗尯涓嶇煕鐩撅紝鍙浠ョ浉浜掗厤鍚堢殑錛屽逛簬閭d簺澶ц塊棶閲忥紝騫朵笖琛ㄦ暟鎹姣旇緝澶氱殑琛錛屾垜浠鍙浠ラ噰鍙栧垎琛ㄥ拰鍒嗗尯緇撳悎鐨勬柟寮忥紝璁塊棶閲忎笉澶э紝浣嗘槸琛ㄦ暟鎹寰堝氱殑琛錛屾垜浠鍙浠ラ噰鍙栧垎鍖虹殑鏂瑰紡絳夈
3錛夈佸垎琛ㄦ妧鏈鏄姣旇緝楹葷儲鐨勶紝闇瑕佹墜鍔ㄥ幓鍒涘緩瀛愯〃錛宎pp鏈嶅姟絝璇誨啓鏃跺欓渶瑕佽$畻瀛愯〃鍚嶃傞噰鐢╩erge濂戒竴浜涳紝浣嗕篃瑕佸壋寤哄瓙琛ㄥ拰閰嶇疆瀛愯〃闂寸殑union鍏崇郴銆
4錛夈佽〃鍒嗗尯鐩稿逛簬鍒嗚〃錛屾搷浣滄柟渚匡紝涓嶉渶瑕佸壋寤哄瓙琛ㄣ


3銆佸垎琛ㄧ殑鍑犵嶆柟寮

3.1 mysql闆嗙兢

瀹冨苟涓嶆槸鍒嗚〃錛屼絾璧峰埌浜嗗拰鍒嗚〃鐩稿悓鐨勪綔鐢ㄣ傞泦緹ゅ彲鍒嗘媴鏁版嵁搴撶殑鎿嶄綔嬈℃暟錛屽皢浠誨姟鍒嗘媴鍒板氬彴鏁版嵁搴撲笂銆傞泦緹ゅ彲浠ヨ誨啓鍒嗙伙紝鍑忓皯璇誨啓鍘嬪姏銆備粠鑰屾彁鍗囨暟鎹搴撴ц兘銆

3.2 鑷瀹氫箟瑙勫垯鍒嗚〃

澶ц〃鍙浠ユ寜鐓т笟鍔$殑瑙勫垯鏉ュ垎瑙d負澶氫釜瀛愯〃銆傞氬父涓轟互涓嬪嚑縐嶇被鍨嬶紝涔熷彲鑷宸卞畾涔夎勫垯銆

Range錛堣寖鍥達級_榪欑嶆ā寮忓厑璁稿皢鏁版嵁鍒掑垎涓嶅悓鑼冨洿銆備緥濡傚彲浠ュ皢涓涓琛ㄩ氳繃騫翠喚鍒掑垎鎴愯嫢騫蹭釜鍒嗗尯銆
Hash錛堝搱甯岋級_榪欎腑妯″紡鍏佽擱氳繃瀵硅〃鐨勪竴涓鎴栧氫釜鍒楃殑Hash Key榪涜岃$畻錛屾渶鍚庨氳繃榪欎釜Hash鐮佷笉鍚屾暟鍊煎瑰簲鐨勬暟鎹鍖哄煙榪涜屽垎鍖恆備緥濡傚彲浠ュ緩絝嬩竴涓瀵硅〃涓婚敭榪涜屽垎鍖虹殑琛ㄣ
Key錛堥敭鍊礆級_涓婇潰Hash妯″紡鐨勪竴縐嶅歡浼革紝榪欓噷鐨凥ash Key鏄疢ySQL緋葷粺浜х敓鐨勩
List錛堥勫畾涔夊垪琛錛塤榪欑嶆ā寮忓厑璁哥郴緇熼氳繃棰勫畾涔夌殑鍒楄〃鐨勫兼潵瀵規暟鎹榪涜屽垎鍓層
Composite錛堝嶅悎妯″紡錛塤浠ヤ笂妯″紡鐨勭粍鍚堜嬌鐢


鍒嗚〃瑙勫垯涓庡垎鍖鴻勫垯涓鏍鳳紝鍦ㄥ垎鍖烘ā鍧楄︾粏浠嬬粛銆


涓嬮潰浠Range綆鍗曚粙緇嶄笅濡備綍鍒嗚〃錛堟寜鐓у勾浠借〃錛夈

鍋囪捐〃緇撴瀯鏈4涓瀛楁碉細鑷澧瀒d錛屽撳悕錛屽瓨嬈鵑噾棰濓紝瀛樻炬棩鏈
鎶婂瓨嬈炬棩鏈熶綔涓鴻勫垯鍒嗚〃錛屽垎鍒鍒涘緩鍑犱釜琛
2011騫達細account_2011
2012騫達細account_2012
??
2015騫達細account_2015
app鍦ㄨ誨啓鐨勬椂鍊欐牴鎹鏃ユ湡鏉ユ煡鎵懼瑰簲鐨勮〃鍚嶏紝闇瑕佹墜鍔ㄦ潵鍒ゅ畾銆

3.3 鍒╃敤merge瀛樺偍寮曟搸鏉ュ疄鐜板垎琛

merge鍒嗚〃錛屽垎涓轟富琛ㄥ拰瀛愯〃錛屼富琛ㄧ被浼間簬涓涓澹沖瓙錛岄昏緫涓婂皝瑁呬簡瀛愯〃錛屽疄闄呬笂鏁版嵁閮芥槸瀛樺偍鍦ㄥ瓙琛ㄤ腑鐨勩

鎴戜滑鍙浠ラ氳繃涓昏〃鎻掑叆鍜屾煡璇㈡暟鎹錛屽傛灉娓呮氬垎琛ㄨ勫緥錛屼篃鍙浠ョ洿鎺ユ搷浣滃瓙琛ㄣ

瀛愯〃2011騫

CREATE TABLE `account_2011` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;
瀛愯〃2012騫

CREATE TABLE `account_2012` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;
涓昏〃錛屾墍鏈夊勾

CREATE TABLE `account_all` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MRG_MYISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
UNION=(`account_2011`,`account_2012`)
INSERT_METHOD=LAST
ROW_FORMAT=DYNAMIC
;
鍒涘緩涓昏〃鐨勬椂鍊欐湁涓狪NSERT_METHOD錛屾寚鏄庢彃鍏ユ柟寮忥紝鍙栧煎彲浠ユ槸錛0 涓嶅厑璁告彃鍏ワ紱FIRST 鎻掑叆鍒癠NION涓鐨勭涓涓琛錛 LAST 鎻掑叆鍒癠NION涓鐨勬渶鍚庝竴涓琛ㄣ

閫氳繃涓昏〃鏌ヨ㈢殑鏃跺欙紝鐩稿綋浜庡皢鎵鏈夊瓙琛ㄥ悎鍦ㄤ竴璧鋒煡璇銆傝繖鏍峰苟涓嶈兘浣撶幇鍒嗚〃鐨勪紭鍔匡紝寤鴻榪樻槸鏌ヨ㈠瓙琛ㄣ

4銆佸垎鍖虹殑鍑犵嶆柟寮

4.1 Range

create table range(
id int(11),
money int(11) unsigned not null,
date datetime
)partition by range(year(date))(
partition p2007 values less than (2008),
partition p2008 values less than (2009),
partition p2009 values less than (2010)
partition p2010 values less than maxvalue
);
4.2 List

create table list(
a int(11),
b int(11)
)(partition by list (b)
partition p0 values in (1,3,5,7,9),
partition p1 values in (2,4,6,8,0)
);
4.3 Hash

create table hash(
a int(11),
b datetime
)partition by hash (YEAR(b)
partitions 4;
4.4 key

create table t_key(
a int(11),
b datetime)
partition by key (b)
partitions 4;
4.5 鍒嗗尯綆$悊

4.5.1 鏂板炲垎鍖

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
4.5.2 鍒犻櫎鍒嗗尯

褰撳垹闄や簡涓涓鍒嗗尯錛屼篃鍚屾椂鍒犻櫎浜嗚ュ垎鍖轟腑鎵鏈夌殑鏁版嵁銆

ALTER TABLE sale_data DROP PARTITION p201010;
4.5.3 鍚堝苟鍒嗗尯

涓嬮潰鐨凷QL錛屽皢p201001 - p201009 鍚堝苟涓3涓鍒嗗尯p2010Q1 - p2010Q3

ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);

⑶ 資料庫分區和分表的區別

分區、分表、分庫的詳細理解
一、什麼是分區、分表、分庫
分區
就是把一張表的數據分成N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的

分表
就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然後操作它。

分庫
一旦分表,一個庫中的表會越來越多

將整個資料庫比作圖書館,一張表就是一本書。當要在一本書中查找某項內容時,如果不分章節,查找的效率將會下降。而同理,在資料庫中就是分區。

二、常用的單機資料庫的瓶頸
問題描述
單個表數據量越大,讀寫鎖,插入操作重新建立索引效率越低。
單個庫數據量太大(一個資料庫數據量到就是極限)
單個資料庫伺服器壓力過大
讀寫速度遇到瓶頸(並發量幾百)
三、分區
什麼時候考慮使用分區?
一張表的查詢速度已經慢到影響使用的時候。

sql經過優化

數據量大

表中的數據是分段的
對數據的操作往往只涉及一部分數據,而不是所有的數據

分區解決的問題
主要可以提升查詢效率

分區的實現方式(簡單)
mysql5 開始支持分區功能

四、分表
什麼時候考慮分表?
一張表的查詢速度已經慢到影響使用的時候。

sql經過優化

數據量大
當頻繁插入或者聯合查詢時,速度變慢

分表解決的問題
分表後,單表的並發能力提高了,磁碟I/O性能也提高了,寫操作效率提高了

查詢一次的時間短了
數據分布在不同的文件,磁碟I/O性能提高
讀寫鎖影響的數據量變小
插入資料庫需要重新建立索引的數據減少
分表的實現方式(復雜)
需要業務系統配合遷移升級,工作量較大

分區和分表的區別與聯系
分區和分表的目的都是減少資料庫的負擔,提高表的增刪改查效率。

分區只是一張表中的數據的存儲位置發生改變,分表是將一張表分成多張表。
當訪問量大,且表數據比較大時,兩種方式可以互相配合使用。
當訪問量不大,但表數據比較多時,可以只進行分區。

常見分區分表的規則策略(類似)
Range(范圍)
Hash(哈希)
按照時間拆分
Hash之後按照分表個數取模
在認證庫中保存資料庫配置,就是建立一個DB,這個DB單獨保存user_id到DB的映射關系

⑷ 什麼是資料庫部署什麼又是資料庫分區的部署分區的管理、操作、恢復又是什麼大概說一下就好

分區存儲提高了資料庫的性能,被分區存儲的數據物理上是多個文件,但邏輯上任然是一個表,對表的任何操作都跟沒分區之前一樣。插入、刪除、查詢、更新等操作的時候,資料庫會自動為你找到對應的分區,然後執行操作。另外的話 把多個數據文件、日誌文件都分別部署在不同的高性能物理盤上,也能大大提高性能.

⑸ 資料庫為什麼要分庫分表

1 基本思想之什麼是分庫分表?
從字面上簡單理解,就是把原本存儲於一個庫的數據分塊存儲到多個庫上,把原本存儲於一個表的數據分塊存儲到多個表上。
2 基本思想之為什麼要分庫分表?


據庫中的數據量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作,增
刪改查的開銷也會越來越大;另外,由於無法進行分布式式部署,而一台伺服器的資源(CPU、磁碟、內存、IO等)是有限的,最終資料庫所能承載的數據量、
數據處理能力都將遭遇瓶頸。
3 分庫分表的實施策略。

分庫分表有垂直切分和水平切分兩種。
3.1
何謂垂直切分,即將表按照功能模塊、關系密切程度劃分出來,部署到不同的庫上。例如,我們會建立定義資料庫workDB、商品資料庫payDB、用戶數據
庫userDB、日誌資料庫logDB等,分別用於存儲項目數據定義表、商品定義表、用戶數據表、日誌數據表等。
3.2
何謂水平切分,當一個表中的數據量過大時,我們可以把該表的數據按照某種規則,例如userID散列,進行劃分,然後存儲到多個結構相同的表,和不同的庫
上。例如,我們的userDB中的用戶數據表中,每一個表的數據量都很大,就可以把userDB切分為結構相同的多個userDB:part0DB、
part1DB等,再將userDB上的用戶數據表userTable,切分為很多userTable:userTable0、userTable1等,
然後將這些表按照一定的規則存儲到多個userDB上。
3.3 應該使用哪一種方式來實施資料庫分庫分表,這要看資料庫中數據量的瓶頸所在,並綜合項目的業務類型進行考慮。
如果資料庫是因為表太多而造成海量數據,並且項目的各項業務邏輯劃分清晰、低耦合,那麼規則簡單明了、容易實施的垂直切分必是首選。

如果資料庫中的表並不多,但單表的數據量很大、或數據熱度很高,這種情況之下就應該選擇水平切分,水平切分比垂直切分要復雜一些,它將原本邏輯上屬於一體
的數據進行了物理分割,除了在分割時要對分割的粒度做好評估,考慮數據平均和負載平均,後期也將對項目人員及應用程序產生額外的數據管理負擔。
在現實項目中,往往是這兩種情況兼而有之,這就需要做出權衡,甚至既需要垂直切分,又需要水平切分。我們的游戲項目便綜合使用了垂直與水平切分,我們首先對資料庫進行垂直切分,然後,再針對一部分表,通常是用戶數據表,進行水平切分。
4 分庫分表存在的問題。

4.1 事務問題。
在執行分庫分表之後,由於數據存儲到了不同的庫上,資料庫事務管理出現了困難。如果依賴資料庫本身的分布式事務管理功能去執行事務,將付出高昂的性能代價;如果由應用程序去協助控制,形成程序邏輯上的事務,又會造成編程方面的負擔。
4.2 跨庫跨表的join問題。
在執行了分庫分表之後,難以避免會將原本邏輯關聯性很強的數據劃分到不同的表、不同的庫上,這時,表的關聯操作將受到限制,我們無法join位於不同分庫的表,也無法join分表粒度不同的表,結果原本一次查詢能夠完成的業務,可能需要多次查詢才能完成。
4.3 額外的數據管理負擔和數據運算壓力。

外的數據管理負擔,最顯而易見的就是數據的定位問題和數據的增刪改查的重復執行問題,這些都可以通過應用程序解決,但必然引起額外的邏輯運算,例如,對於
一個記錄用戶成績的用戶數據表userTable,業務要求查出成績最好的100位,在進行分表之前,只需一個order
by語句就可以搞定,但是在進行分表之後,將需要n個order
by語句,分別查出每一個分表的前100名用戶數據,然後再對這些數據進行合並計算,才能得出結果。

熱點內容
什麼配置能玩csgo 發布:2024-07-08 22:52:21 瀏覽:714
ios手機陰陽師掛機腳本 發布:2024-07-08 22:48:30 瀏覽:319
java復制類 發布:2024-07-08 22:46:16 瀏覽:585
bat腳本set 發布:2024-07-08 22:37:12 瀏覽:281
資料庫來源期刊 發布:2024-07-08 22:36:21 瀏覽:503
sqldeveloper怎麼建立連接配置 發布:2024-07-08 22:27:47 瀏覽:328
c語言字元T 發布:2024-07-08 22:03:42 瀏覽:950
曙光伺服器bmc口ip 發布:2024-07-08 21:32:05 瀏覽:202
什麼安卓模擬器能多開 發布:2024-07-08 21:04:49 瀏覽:838
隊友腳本 發布:2024-07-08 21:00:37 瀏覽:293