分表,分区,分库概念及实现

分表(参考文章(侵权删))

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集群这样的话题是一个很大的话题,不是单单百度下就可以了解其中的奥妙的,时间才是检验真理的唯一标准,不管是使用哪种方式去分区,分表,分库,都有优缺点,最好是根据项目实际出发,考量。

你可能感兴趣的:(分表,分区,分库概念及实现)