Mysql-分库分区分表

大数据-分表分区分库
问题集:
1、分表时两张表的数据都一样么?如果一样,只是降低了表的访问量,但是如果数据多了还是没有提高查询的效率
答:分表是对一张表中的数据按照某种规则进行拆分到三张表中,三张表的所有数据才是完整的数据
2、如果是分库,分表联合使用,那么一个库进行读,一个库进行写,那么数据时怎么保持一致呢
为什么要进行数据库数据表的分离:
一个数据库,一张表,随着时间的推移,客户量的增多,一张表的数据量就很容易的提高一个甚至更多的量级,
那么我们进行修改和查询就很费时,所以需要对数据进行切分操作。
分区 :就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的

分表 :就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。

分库:就是分成多个数据库实例,每个数据库实例中表名相同
什么时候进行分区、分表:
1、当数据特别大但是访问的人不多时可以只进行分区
 2、当数据特别大访问的人多时进行分表和分区结合
什么时候进行分库:
当一个数据库不足以存储所有的数据时
分库的规则:1.垂直拆分:根据不同的业务种类在不同的数据库存储不同的数据信息(最好是0耦合)
垂直分库-->水平分库-->读写分离
对于分表的处理:
通过创建分表和总表(汇总了所有分表的数据),添加数据时以总表为模板创建数据,以某种计算规则得出添加到什么分表中,这样就不会出现总表中主键冲突的问题
查询时也是同样,以某种规则得到查询的时什么分表中的数据
分区执行代码分析:

CREATE TABLE IF NOT EXISTS `user` (   
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',   
   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',   
   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',   
   PRIMARY KEY (`id`)   
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

PARTITION BY RANGE (id) (   
     PARTITION p0 VALUES LESS THAN (3),   
     PARTITION p1 VALUES LESS THAN (6),   
     PARTITION p2 VALUES LESS THAN (9),
     PARTITION p3 VALUES LESS THAN (12),   
     PARTITION p4 VALUES LESS THAN MAXVALUE   
);

创建一个用户,并通过id进行分区处理

alter table user drop partition p2;

 删除分区信息,同时也会删除该分区中的数据

alter table user partition by RANGE(id)
(PARTITION p1 VALUES less than (5),   
PARTITION p2 VALUES less than (10),   
PARTITION p3 VALUES less than MAXVALUE);

 重排分区信息

alter table user1 add partition(partition p4 values less than MAXVALUE);

 添加分区信息

alter table user1 add partition(partition p4 values less than (17));

添加分区信息,使用前提,没有配置MAXVALUE
分表代码执行分析

CREATE TABLE IF NOT EXISTS `user1` (   
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',   
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',   
  `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',   
  PRIMARY KEY (`id`)   
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
            
CREATE TABLE IF NOT EXISTS `user2` (   
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',   
   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',   
   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',   
   PRIMARY KEY (`id`)   
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

创建两张表信息

create table  user_total like user1;

创建总表汇总来源于user1表

ALTER TABLE user_total ENGINE=MRG_MYISAM UNION=(user1,user2) INSERT_METHOD=LAST;

更改总表的数据来源,来源于表user1和表user2

注意:在使用时,需要先分表再分区,先分区再分表会出现引擎无法再分区表中使用,无法创建分表

posted @ 2020-01-15 09:37  李向龙  阅读(279)  评论(0编辑  收藏  举报