分表的意義:
?
我覺(jué)得主要還是解決鎖表的問(wèn)題,縮短SQL執(zhí)行時(shí)間。
我了解的分表方式有這么幾種
1.基本信息一個(gè)表 詳細(xì)信息一個(gè)表
2.解決1對(duì)1 , 1對(duì)多 多對(duì)多的關(guān)系
3.像日志這樣的有時(shí)間性,可以一個(gè)月一個(gè)表
4.像用戶這樣的有用戶ID,可以根據(jù)用戶ID的大小分段,1-10000一個(gè)表
5.hash分表
6.表分區(qū),MYSQL在5.3后支持表分區(qū)了,目的也一樣
我說(shuō)一下我的一個(gè)應(yīng)用吧,我用的是HASH分表,對(duì)用戶名做HASH進(jìn)行分表,用戶量目前為1億,
分了100個(gè)用戶分表,每個(gè)分表里存著100萬(wàn)條用戶信息,分表里冗余了user_id user_name,因?yàn)檫@二個(gè)字段是不會(huì)變的
幾種應(yīng)用場(chǎng)景:
1、注冊(cè),對(duì)用戶名HASH,然后寫(xiě)入對(duì)應(yīng)的分表
2、登錄,通過(guò)用戶名HASH值,直接查相應(yīng)的分表
3、修改密碼、修改用戶信息,直接改相應(yīng)的分表
對(duì)于注冊(cè)時(shí)自增user_id,user_name的唯一性檢查采用別的方式解決
?
?
?
單張表的訪問(wèn)及寫(xiě)入很頻繁,這時(shí)候就可以根據(jù)一定的業(yè)務(wù)規(guī)則來(lái)分表,這樣就能減輕單表壓力,并且還能解決各個(gè)模塊的之間的頻繁交互問(wèn)題。
另外比如說(shuō)用戶信息表,我們把用戶的基本信息(如用戶id,用戶名)放在一個(gè)表中,再將其他用戶擴(kuò)展信息放在另外的一些表中,這樣既因?yàn)榛拘畔⒌脑L問(wèn)非常頻繁,另外也方便了我們使用mencache等緩存來(lái)替代這個(gè)表的查詢功能,如果啟用緩存,程序改動(dòng)也會(huì)非常的小。
?
?
- 使得單表單次查詢所需的檢索行數(shù)變少,時(shí)延變短。
- 使得產(chǎn)生表鎖爭(zhēng)奪的幾率和代價(jià)變低,吞吐量變高
?
補(bǔ)充一個(gè):
1、使用MyISAM存儲(chǔ)引擎創(chuàng)建表的時(shí)候,當(dāng)表不包含變量長(zhǎng)度列(VARCHAR, BLOB, 或TEXT)時(shí),表使用靜態(tài)格式存儲(chǔ),這種格式每一行用固定的字節(jié)來(lái)存儲(chǔ),能提高讀取速度
2、將大字段從原表中拆分出來(lái),通過(guò)單獨(dú)的表進(jìn)行存放,讓我們?cè)谠L問(wèn)其他數(shù)據(jù)的時(shí)候大大降低 IO 訪問(wèn),從而使性能得到較大的改善。
具體的,可以閱讀《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》這邊書(shū),寫(xiě)得很不錯(cuò)
?
?
——————————————————————————————————————————
mysql水平分表和垂直分表的優(yōu)缺點(diǎn)
?
表分割有兩種方式:
1水平分割:根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中。
水平分割通常在下面的情況下使用。
?表很大,分割后可以降低在查詢時(shí)需要讀的數(shù)據(jù)和索引的頁(yè)數(shù),同時(shí)也降低了索引的層數(shù),提高查詢速度。
?表中的數(shù)據(jù)本來(lái)就有獨(dú)立性,例如表中分別記錄各個(gè)地區(qū)的數(shù)據(jù)或不同時(shí)期的數(shù)據(jù),特別是有些數(shù)據(jù)常用,而另外一些數(shù)據(jù)不常用。
?需要把數(shù)據(jù)存放到多個(gè)介質(zhì)上。
? 水平分割會(huì)給應(yīng)用增加復(fù)雜度,它通常在查詢時(shí)需要多個(gè)表名,查詢所有數(shù)據(jù)需要union操作。在許多數(shù)據(jù)庫(kù)應(yīng)用中,這種復(fù)雜性會(huì)超過(guò)它帶來(lái)的優(yōu)點(diǎn),因?yàn)橹灰饕P(guān)鍵字不大,則在索引用于查詢時(shí),表中增加兩到三倍數(shù)據(jù)量,查詢時(shí)也就增加讀一個(gè)索引層的磁盤(pán)次數(shù)?! ?/p>
2垂直分割:把主碼和一些列放到一個(gè)表,然后把主碼和另外的列放到另一個(gè)表中。
如果一個(gè)表中某些列常用,而另外一些列不常用,則可以采用垂直分割,另外垂直分割可以使得數(shù)據(jù)行變小,一個(gè)數(shù)據(jù)頁(yè)就能存放更多的數(shù)據(jù),在查詢時(shí)就會(huì)減少I/O次數(shù)。其缺點(diǎn)是需要管理冗余列,查詢所有數(shù)據(jù)需要join操作。?
本文摘自 :https://blog.51cto.com/l