【MySQL优化】分区

mysql分表和分区有什么联系呢?

1.都能提高mysql的性高,在高并发状态下都有一个良好的表现。
2.对于那些大访问量,并且数据比较多的表,分表和分区可以同时使用(MERGE分表引擎不支持分区)。
3、数据表中数据量很大时优先选用分表,分区有很多限制。

分区局限:

1、MERGE引擎进行分表以后,该表不支持分区。同样,分区也不支持merge引擎。
2、分区不支持全文索引。
3、临时表不能被分区。
4、分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL。唯一的例外是当分区类型为KEY分区的时候,可以使用其他类型的列作为分区键( BLOB or TEXT 列除外)。
5、 只有RANG和LIST分区能进行子分区。HASH和KEY分区不能进行子分区。

1、分区的几种方式

分区就是把一个数据表的文件和索引分散存储在不同的物理文件中。
RANGE(范围、常用):这种模式允许DBA将数据划分不同范围。
//建立一个users 表 以id进行分区, id 小于3000000的p0分区,id小于6000000的在p1分区
CREATE TABLE users (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
usersname VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
 
PARTITION BY RANGE (id)(
PARTITION p0 VALUES LESS THAN (3000000),
PARTITION p1 VALUES LESS THAN (6000000),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
LIST(预定义列表):这种模式允许系统通过定义的列表的值所对应的行数据进行分割。
//根据用户的类型进行分区
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
user_type intnotnull
)
 
PARTITION BY LIST (user_type )(
PARTITION p0 VALUES IN (0,4,8,12),
PARTITION p1 VALUES IN (1,5,9,13),
PARTITION p2 VALUES IN (2,6,10,14),
PARTITION p3 VALUES IN (3,7,11,15)
);
Hash(哈希):这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。
//建立一个对表主键进行分区的表
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
 
PARTITION BY HASH (id) PARTITIONS 4(
PARTITION p0 ,
PARTITION p1,
PARTITION p2,
PARTITION p3
);
Key(键值):上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的
//建立一个对表主键进行分区的表
CREATE TABLE user (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL DEFAULT '',
email VARCHAR(30) NOT NULL DEFAULT ''
)
 
PARTITION BY KEY (id) PARTITIONS 4(
PARTITION p0,
PARTITION p1,
PARTITION p2,
PARTITION p3
);

2、分区管理

2.1、删除分区
//删除分区同时删除数据
ALERT TABLE users DROP PARTITION p0;
2.2、重建分区
//RANGE 分区重建:将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。
ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES LESS THAN (6000000));
 
//LIST 分区重建:将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。
ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES IN(0,1,4,5,8,9,12,13));
 
//HASH/KEY 分区重建:
//用 REORGANIZE 方式重建分区的数量变成2,在这里数量只能减少不能增加。想要增加可以用 ADD PARTITION 方法。
ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2;

2.3、新增分区

//新增 RANGE 分区
alter table user add partition(partition user_3 values less than maxvalue);
//新增 LIST 分区
ALTER TABLE category ADD PARTITION (PARTITION p4 VALUES IN (16,17,18,19));
//新增 HASH/KEY 分区,将分区总数扩展到8个。
ALTER TABLE users ADD PARTITION PARTITIONS 8;
2.4、在已有的表加上分区
//users表通过id进行分区
alter table users partition by RANGE (id)
(
PARTITION p0 VALUES LESS THAN (100),
PARTITION P12 VALUES LESS THAN (200)
);
 

 

猜你喜欢

转载自www.cnblogs.com/php99/p/9766226.html