1.分库分区分表概念
分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
分表
就是把一张数据量很大的表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。表名可以按照某种业务hash进行映射。
分库
一旦分表,一个库中的表会越来越多
2.实现
2.1分区的实现方式(简单)
mysql5 开始支持分区功能
RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的RANGE COLUMN分区。RANGE分区必须的连续的且不能重叠。使用
“VALUES LESS THAN ()”
来定义分区区间,非整形的范围值需要使用单引号,并且可以使用MAXVALUE作为分区的最高值。
id INT AUTO_INCREMENT,
amount DOUBLE NOT NULL,
order_day DATETIME NOT NULL,
PRIMARY KEY(id, order_day)
)ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE(YEAR(order_day))(
PARTITION p0 VALUES LESS THAN (2016),
PARTITION p1 VALUES LESS THAN (2017),
PARTITION p2 VALUES LESS THAN (2018),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
INSERT INTO fenquTable(id,amount,order_day) VALUES(1,3.0,'1990-03-04'),(2,12.0,'1995-03-04');
操作记录:
EXPLAIN SELECT id,amount,order_day FROM fenqu WHERE id ='1'
对于日期字段分区,查询条件使用> 、< 、betnwen、=都会利用分区查询,如果条件使用函数转换则不会走分区,比如使用YEAR()。
增加分区
alter table employees add PARTITION (PARTITION p4 VALUES LESS THAN MAXVALUE);
注意:增加分区只能在最大端增加
删除分区
alter table employees drop PARTITION p4;
注意:通过这种删除分区的方式会将分区中的数据也删除,慎用!!!!。但是通过删除分区的方式删除数据会比delete快很多,因为它相当于删除一个数据库一样因为每个分区都是一个独立的数据文件。用来删除历史分区数据是非常好的办法。
拆分合并分区
拆分合并分区统称为重新定义分区,拆分分为不会造成数据的丢失,只将会将数据从一个分区移动到另一个分区。
例1:将P0拆分成s1,s2两个分区
ALTER TABLE employees REORGANIZE PARTITION p0 INTO ( PARTITION s0 VALUES LESS THAN (3), PARTITION s1 VALUES LESS THAN (6) );
2.2 分表操作
利用merge存储引擎来实现分表
create table if not exists user1 (
id int(10) not null auto_increment,
name varchar(20) default null,
sex int(1) not null default 0,
primary key (id)
) engine = MyISAM default charset = utf8 auto_increment=1;
create table if not exists user2 (
id int(10) not null auto_increment,
name varchar(20) default null,
sex int(1) not null default 0,
primary key (id)
) engine = MyISAM default charset = utf8 auto_increment=1;
如下:
create table user_total like user1;(as创建出来的t2表(新表)缺少t1表(源表)的索引信息,只有表结构相同,没有索引。like 创建出来的新表包含源表的完整表结构和索引信息)
ALTER TABLE user_total ENGINE=MRG_MYISAM UNION=(user1,user2) INSERT_METHOD=LAST;
show create table alluser;
向两张表中分别插入数据:
insert into user1(name,sex) values('张三','0');
insert into user2(name,sex) values('李四','1');
查看
SELECT * FROM user_total;
INSERT INTO user_total(NAME,sex) VALUES('李四2','0');
查看分表:
select * from user2;