照你的需求來看,可以有兩種方式,一種是分表,另一種是分區(qū) 首先是分表,就像你自己所說的,可以按月分表,可以按用戶ID分表等等,至于采用哪種方式分表,要看你的業(yè)務(wù)邏輯了,分表不好的地方就是查詢有時(shí)候需要跨多個(gè)表。 然后是分區(qū),分區(qū)可以將表分離在若干不同的表空間上,用分而治之的方法來支撐無限膨脹的大表,給大表在物理一級(jí)的可管理性。將大表分割成較小的分區(qū)可以改善表的維護(hù)、備份、恢復(fù)、事務(wù)及查詢性能。分區(qū)的好處是分區(qū)的優(yōu)點(diǎn): 1 增強(qiáng)可用性:如果表的一個(gè)分區(qū)由于系統(tǒng)故障而不能使用,表的其余好的分區(qū)仍然可以使用; 2 減少關(guān)閉時(shí)間:如果系統(tǒng)故障只影響表的一部分分區(qū),那么只有這部分分區(qū)需要修復(fù),故能比整個(gè)大表修復(fù)花的時(shí)間更少; 3 維護(hù)輕松:如果需要重建表,獨(dú)立管理每個(gè)分區(qū)比管理單個(gè)大表要輕松得多; 4 均衡I/O:可以把表的不同分區(qū)分配到不同的磁盤來平衡I/O改善性能; 5 改善性能:對大表的查詢、增加、修改等操作可以分解到表的不同分區(qū)來并行執(zhí)行,可使運(yùn)行速度更快; 6 分區(qū)對用戶透明,最終用戶感覺不到分區(qū)的存在。
10年的江城網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整江城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“江城網(wǎng)站設(shè)計(jì)”,“江城網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
行格式為Compact是如何存儲(chǔ)大數(shù)據(jù)的:
[vb]?view plain?copy
mysql?select?version();
+-----------+
|?version()?|
+-----------+
|?5.1.73????|
+-----------+
1?row?in?set?(0.01?sec)
mysql?show?table?status?like?'row'\G;
***************************?1.?row?***************************
Name:?row
Engine:?InnoDB
Version:?10
Row_format:?Compact
Rows:?1
Avg_row_length:?81920
Data_length:?81920
Max_data_length:?0
Index_length:?0
Data_free:?0
Auto_increment:?NULL
Create_time:?2017-01-04?21:46:02
Update_time:?NULL
Check_time:?NULL
Collation:?latin1_swedish_ci
Checksum:?NULL
Create_options:
Comment:
1?row?in?set?(0.00?sec)
我們建立一張測試表,插入數(shù)據(jù):
[html]?view plain?copy
CREATE?TABLE?`row`?(
`content`?varchar(65532)?NOT?NULL?DEFAULT?''
)?ENGINE=InnoDB?DEFAULT?CHARSET=latin1
mysql?insert?into?row(content)?select?repeat('a',65532);
Query?OK,?1?row?affected?(0.03?sec)
Records:?1??Duplicates:?0??Warnings:?0
我們使用 py_innodb_page_info.py 工具來查看表中的頁分布:
[vb]?view plain?copy
[root@localhost?mysql]#?python?py_innodb_page_info.py?-v?com/row.ibd
page?offset?00000000,?page?type?File?Space?Header
page?offset?00000001,?page?type?Insert?Buffer?Bitmap
page?offset?00000002,?page?type?File?Segment?inode
page?offset?00000003,?page?type?B-tree?Node,?page?level?0000
page?offset?00000004,?page?type?Uncompressed?BLOB?Page
page?offset?00000005,?page?type?Uncompressed?BLOB?Page
page?offset?00000006,?page?type?Uncompressed?BLOB?Page
page?offset?00000007,?page?type?Uncompressed?BLOB?Page
Total?number?of?page:?8:
Insert?Buffer?Bitmap:?1
Uncompressed?BLOB?Page:?4
File?Space?Header:?1
B-tree?Node:?1
File?Segment?inode:?1
可以看出,第4頁的 B-tree Node, page level 0000 格式為數(shù)據(jù)頁,存放著MySQL的行數(shù)據(jù)。 Uncompressed BLOB Page 可以理解為MySQL存放大數(shù)據(jù)的地方,暫且叫作外部存儲(chǔ)頁。Compact格式?jīng)]有將大數(shù)據(jù)全部放在數(shù)據(jù)頁中,而是將一部分?jǐn)?shù)據(jù)放在了外部存儲(chǔ)頁中。那么,是全部數(shù)據(jù)在外部存儲(chǔ)頁中,還是一部分?jǐn)?shù)據(jù)。假如是一部分?jǐn)?shù)據(jù),這一部分是多少呢?
我們使用 hexdump -Cv row.ibd 查看一下數(shù)據(jù)頁 B-tree Node, page level 0000 ,也就是第4頁:
[vb]?view plain?copy
3073?0000c000??8c?25?17?57?00?00?00?03??ff?ff?ff?ff?ff?ff?ff?ff??|.%.W....????????|
3074?0000c010??00?00?00?00?00?07?3a?b8??45?bf?00?00?00?00?00?00??|......:?E?......|
3075?0000c020??00?00?00?00?00?02?00?02??03?a6?80?03?00?00?00?00??|.........?......|
3076?0000c030??00?7f?00?05?00?00?00?01??00?00?00?00?00?00?00?00??|................|
3077?0000c040??00?00?00?00?00?00?00?00??00?13?00?00?00?02?00?00??|................|
3078?0000c050??00?02?00?f2?00?00?00?02??00?00?00?02?00?32?01?00??|...?.........2..|
3079?0000c060??02?00?1c?69?6e?66?69?6d??75?6d?00?02?00?0b?00?00??|...infimum......|
3080?0000c070??73?75?70?72?65?6d?75?6d??14?c3?00?00?10?ff?f1?00??|supremum.?...??.|
3081?0000c080??00?00?00?04?03?00?00?00??00?13?12?80?00?00?00?2d??|...............-|
3082?0000c090??01?10?61?61?61?61?61?61??61?61?61?61?61?61?61?61??|..aaaaaaaaaaaaaa|
3083?0000c0a0??61?61?61?61?61?61?61?61??61?61?61?61?61?61?61?61??|aaaaaaaaaaaaaaaa|
3084?0000c0b0??61?61?61?61?61?61?61?61??61?61?61?61?61?61?61?61??|aaaaaaaaaaaaaaaa|
3085?0000c0c0??61?61?61?61?61?61?61?61??61?61?61?61?61?61?61?61??|aaaaaaaaaaaaaaaa|
....
....
3128?0000c370??61?61?61?61?61?61?61?61??61?61?61?61?61?61?61?61??|aaaaaaaaaaaaaaaa|
3129?0000c380??61?61?61?61?61?61?61?61??61?61?61?61?61?61?61?61??|aaaaaaaaaaaaaaaa|
3130?0000c390??61?61?00?00?00?02?00?00??00?04?00?00?00?26?00?00??|aa.............|
3131?0000c3a0??00?00?00?00?fc?fc?00?00??00?00?00?00?00?00?00?00??|....??..........|
3132?0000c3b0??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??|................|
3133?0000c3c0??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??|................|
3134?0000c3d0??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??|................|
...
...
4093?0000ffc0??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??|................|
4094?0000ffd0??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??|................|
4095?0000ffe0??00?00?00?00?00?00?00?00??00?00?00?00?00?00?00?00??|................|
4096?0000fff0??00?00?00?00?00?70?00?63??01?a1?6c?2b?00?07?3a?b8??|.....p.c.?l+..:?|
mysql數(shù)據(jù)庫對1億條數(shù)據(jù)的分表方法設(shè)計(jì):
目前針對海量數(shù)據(jù)的優(yōu)化有兩種方法:
(1)垂直分割
優(yōu)勢:降低高并發(fā)情況下,對于表的鎖定。
不足:對于單表來說,隨著數(shù)據(jù)庫的記錄增多,讀寫壓力將進(jìn)一步增大。
(2)水平分割
如果單表的IO壓力大,可以考慮用水平分割,其原理就是通過hash算法,將一張表分為N多頁,并通過一個(gè)新的表(總表),記錄著每個(gè)頁的的位置。
假如一個(gè)門戶網(wǎng)站,它的數(shù)據(jù)庫表已經(jīng)達(dá)到了1億條記錄,那么此時(shí)如果通過select去查詢,必定會(huì)效率低下(不做索引的前提下)。為了降低單表的讀寫IO壓力,通過水平分割,將這個(gè)表分成10個(gè)頁,同時(shí)生成一個(gè)總表,記錄各個(gè)頁的信息,那么假如我查詢一條id=100的記錄,它不再需要全表掃描,而是通過總表找到該記錄在哪個(gè)對應(yīng)的頁上,然后再去相應(yīng)的頁做檢索,這樣就降低了IO壓力。