分表(参考文章(侵权删))
1.目的:如用户表,随着业务不断扩展,表越来愈大,代码里的sql语句就会慢慢越来越慢,这个时候将一个表分解成多个表,每个表查询时控制在良好的速度,这样就起到了优化的作用。
2.实现方式:1)水平分表,即表的数据结构相同,只是存储的数据不同 [merge引擎分表只能在MyISAM引擎下,不支持InnoDB]
具体实现:1.创建表:表1 -> create table tb_member1(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
表2 -> create table tb_member2 like tb_member1;
表3(关键,总表只是一个外壳,存取数据发生在一个一个的分表里面,不管是更新还是增加总表都跟随分表) -> DROP table IF EXISTS tb_member;
create table tb_member(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;
2.定义一个算法,来检测,什么时候访问哪个表
这个可以自己从逻辑上去控制,比如说新增,规定一个表最多只能存储1000个用户,判断表大小然后存储在对应的表里,如果是更新操作,根据用户的id来找哪个用户存储在哪个表即可。
2)垂直分表:将一张表按照列进行分
如:用户表有如下字段,id,name,sex,money 就可以分成表1id,name,sex 表2 id,money 将冷数据(不常变化的数据)放在一张表,热数据(经常变动的数据)放在一张表 冷数据可用MyISAM(适合读取)的引擎,热数据用InnoDB(适合写)的引擎
分库
分库的理念其实同分表差不多,例如,一个系统中存在用户表,商品表,系统表等,随着业务的不断扩展,表的数据不断壮大,为了减少数据库的并发量,可以单独将用户表分离出数据库,形成新的用户中心数据库,商品表同样成为商品中心数据库。操作的时候根据分解的规则去操作数据库,如果是分库的话,业务逻辑中肯定会牵扯到多数据库操作
分区(请参考文章一 文章二 侵权删)
1.数据存放格式
myisam: .frm(存放表结构). myd(存放表数据).myi(存表索引)
innnodb:.frm(存放表结构).idb(存放数据和索引)
用range方式进行分区:
1)创建数据表并创建分区:create table t1 (id int not null)
partition BY RANGE (id) (
partition p0 VALUES LESS THAN (6),
partition p1 VALUES LESS THAN (11),
partition p2 VALUES LESS THAN (16),
partition p3 VALUES LESS THAN (21)
);
2)数据表已存在,创建分区:ALTER TABLE t1 PARTITION BY RANGE (id)
( PARTITION p1 VALUES LESS THAN (6),
PARTITION p2 VALUES LESS THAN (6),
PARTITION p3 VALUES LESS THAN MAXVALUE );
用list方式进行分区
创建表和创建分区都同上,只是关键字为list
PARTITION BY LIST(store_id)
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);
还有其他分区方式,目前我这两种是比较好理解的
遗留问题:分表和分库时怎么保证线上数据库正常运行,同时也不影响以后的业务,这个可能是非常麻烦也关键的
总结:以上所有都只是为进一步学习下mysql数据相关的知识,关于分表,分库,分区,mysql集群这样的话题是一个很大的话题,不是单单百度下就可以了解其中的奥妙的,时间才是检验真理的唯一标准,不管是使用哪种方式去分区,分表,分库,都有优缺点,最好是根据项目实际出发,考量。
网友评论