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) );