mysql分表规则(转)

author:skate
time:2013/05/14

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,
      `picurl` VARCHAR(200) NULL DEFAULT NULL COMMENT ‘属性值说明图片,保存图片相对地址‘,
      `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.表的行数预估就很简单,根据业务特点,访问量等预估

mysql的整型类型有这样几种:类型      占用字节tinyint        1smallint     2mediumint 3int              4bigint         8这是决定存储需要占用多少字节tinyint(M), M默认为4;SMALLINT(M), M默认为6;MEDIUMINT(M), M默认为9;INT(M),M默认为11;BIGINT(M),M默认为20.

转载地址:http://blog.csdn.net/wyzxg/article/details/8930658
时间: 2024-08-07 23:40:47

mysql分表规则(转)的相关文章

MYSQL 分表实践

基本条件: 无索引 主表 test_0 数据:一百万条  数据库引擎 InnoDb 分表 test_1...test_100 数据 每张一万条,一共一百万条  数据库引擎 InnoDb 流程: 主表中修改100条数据,计算花费时间 某一张分表中修改1条数据,计算花费时间 在总表中查询一个SQL,计算花费时间 在100张分表中查询一个SQL,计算花费时间 可以看出,在总表和分表,在百万级别一下,修改的时间差不多,但在查询的时候,差别非常大,当然这是和索引有关,后自测100W,有索引,速度还是相当快

mysql分表和表分区详解

为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率. 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件.这些子表可以分布在

mysql分表的三种方法

mysql分表的3种方法 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. 根据个人经验,mysql执行一个sql的过程如下:1,接收到sql;2,把sql放到排队队列中 ;3,执行sql;4,返回执行结果.在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间.其实这二个是一回事,等待的同时,肯定有sql在执行.所以我们要缩短sql的执行

mysql分表研究

分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得 单表记录条数达到百万到千万级别时就要使用分表了. 1,分表的分类 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表.(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的.) 分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的) 案例: 对于一个博客系统,文章标题,作者,分类

一、mysql分表简单介绍

一.Mysql分表的原因 1.当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 2.mysql中有一种机制是表锁定和行锁定,为什么要出现这种机制,是为了保证数据的完整性, 我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢? 很显然mysql对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innod

总结下Mysql分表分库的策略及应用

上月前面试某公司,对于mysql分表的思路,当时简要的说了下hash算法分表,以及discuz分表的思路,但是对于新增数据自增id存放的设计思想回答的不是很好(笔试+面试整个过程算是OK过了,因与个人预期的薪酬不太理想而忍痛放弃.),在此再深究下mysql 分表优化之类的设计思路方案.先来闲扯下发文目的: 为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情

【mysql】mysql分表和表分区详解

为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率. 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件.这些子表可以分布在

mysql分表与分区表

mysql分表与分区表 转自:http://blog.51yip.com/mysql/949.html   一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短

Mysql分表和分区的区别、分库分表介绍与区别

分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考mysql分区功能详细介绍,以及实例 二,mysql分表和分区有什么区别呢 1,实现方式上 a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表