mysql分表準則
在大量使用mysql時,資料量大、高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充
環境:業務型別:oltp
硬體:cpu:8cpu 2.4ghz
mem:48g
磁碟:raid5 6×sas
什麼樣的表需要拆分:根據表的體積、表的行數、訪問特點來衡量表是否需要拆分
一.拆分標準是:
1.表的體積大於2g或行數大於1000w,以單錶主鍵等簡單形式訪問資料,這個時候需要分表
2.表的體積大於2g或行數大於500w,以兩表jion,小範圍查詢(結果集小100行)等形式訪問資料,這個時候需要分表
3.表的體積大於2g或行數大於200w,以多表join,範圍查詢,order by,group by,高頻率等複雜形式訪問資料,尤其dml,這個時候需要分表
4.表的字段中含有text等大字段的、varchar(500)以上的、很少使用的字元型字段拆分成父子表,這種分表可以和以上聯合使用
5.資料有時間過期特性的,需要做資料分表歸檔處理
只要達到上面任何乙個標準,都需要做分表處理
二.分表方法:
1.冷熱資料分表:適用小訪問量,冷資料很少使用
1.1 單表字段很多,把頻繁使用整型欄位的和非頻繁使用的字元型字段或大字段拆到兩個表中
1.2 表資料具有時間過期性,把過期資料拆分到歷史表裡或者按時間梯度分表
2.橫向分表:適用大訪問量
2.1 如雜湊等分切表或其他基於對某數字取餘的切表,優點是方便資料分布,缺點是無法再擴充套件
2.2 按主鍵id遞增分表,比如每100w個id乙個分表,優點是方便擴充套件,缺點是壓力不均
2.3 按日期分表,比如每天、每月、每年乙個分表,優點是方便擴充套件,缺點是壓力不均
說明1.表的體積如何預估
create table `td_skate` (
`valid` bigint(20) not null auto_increment comment '值id',
`propertyid` bigint(20) null default null comment '屬性id',
`text` varchar(400) null default null,
`entext` varchar(400) null default null,
`isother` bigint(20) null default null comment '是否是other值, 0 否 1 是',
`createtime` datetime null default null comment '建立時間',
`createuser` bigint(20) null default null comment '建立使用者',
`lastmodify` datetime null default null comment '最後修改時間',
`updatetimeuser` bigint(20) null default null comment '最後修改人',
`deletetime` datetime null default null comment '刪除時間',
`deleteuser` bigint(20) null default null comment '刪除人',
`description` varchar(4000) null default null comment '產品描述',
`isdelete` int(11) null default '0',
primary key (`valid`),
index `fk_td_prodline_attrval_td_prodline_attr` (`propertyid`),
constraint `fk_td_prodline_attrval_td_prodline_attr` foreign key (`propertyid`) references `td_prodline_attr` (`propertyid`)
collate='utf8_general_ci'
engine=innodb
auto_increment=2491650;
把錶的所有字段占用位元組數相加,再乘以預估行數就是表的體積,比如上面的表,預估有1000w,那他的體積是
(8+8+400+400+200+8+8+8+8+8+8+8+4000+8)×10000000=50.8g,可以看到這個表設計非常不合理,可以修改如下:
int替代bigint
timestamp替代datetime
狀態位isdelete用tinyint替代
根據業務特點看能否把varchar(4000)放到乙個字表中
優化後表大小:(4+4+400+400+200+4+4+4+4+4+4+4+1)×10000000=10.37g,如果要進一步提公升效能,需要刪除外來鍵,分表,保證單錶在2g以下。
如果需要檢視description資訊,通過主鍵關聯檢視子表,只會掃瞄有效的子表資訊, 效能將會提公升非常大。
2.表的行數預估就很簡單,根據業務特點,訪問量等預估
-------end------
mysql分表的原則 Mysql分表準則
mysql分表準則 在大量使用mysql時,資料量大 高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充 環境 業務型別 oltp 硬體 cpu 8cpu 2.4ghz mem 48g 磁碟 raid5 6sas 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特 mys...
mysql分表分庫實現 MySql分表分庫思路
一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...
mysql分表技術詳解 mysql分表詳解
本人混跡qq群2年多了,經常聽到有人說 資料表太大了,需要分表 x了,要分表 的言論,那麼,到底為什麼要分表?難道資料量大就要分表?mysql資料量對索引的影響 本人mysql版本為5.7 新增資料測試 為了測試mysql索引查詢是否和資料量有關,本人做了以下的測試準備 新建4個表article1,...