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