ITPub博客

首页 > 数据库 > MySQL > MySQL 分区

MySQL 分区

原创 MySQL 作者:starive 时间:2014-09-09 10:53:34 0 删除 编辑

 MySQL 分区

 

一  查看是否支持分区

  1. mysql> SHOW VARIABLES LIKE \'%partition%\';
  2. +-------------------+-------+
  3. | Variable_name | Value |
  4. +-------------------+-------+
  5. | have_partitioning | YES |
  6. +-------------------+-------+
  7. 1 row in set (0.00 sec)


二  各大分区


1  Range分区


  1. CREATE TABLE emp3 (
  2.   id int(11) NOT NULL,
  3.   ename varchar(30) DEFAULT NULL,
  4.   hired date NOT NULL DEFAULT \'1970-01-01\',
  5.   separated date NOT NULL DEFAULT \'9999-12-31\',
  6.   job varchar(30) NOT NULL,
  7.   store_id int(11) NOT NULL
  8. ) PARTITION BY RANGE (store_id)
  9. (PARTITION p0 VALUES LESS THAN (10) ,
  10.  PARTITION p1 VALUES LESS THAN (20) ,
  11.  PARTITION p2 VALUES LESS THAN (30)
  12. );


增加分区

  1. alter table emp add partition( PARTITION p3 VALUES LESS THAN MAXVALUE);


插入数据后,查看各分区数量:


  1. mysql> select partition_name part, partition_expression expr,partition_description descr, table_rows from information_schema.partitions where table_schema=schema() and table_name='emp3';
  2. +------+----------+----------+------------+
  3. | part | expr | descr | table_rows |
  4. +------+----------+----------+------------+
  5. | p0 | store_id | 10 |       0 |
  6. | p1 | store_id | 20 |       0 |
  7. | p2 | store_id | 30 |       0 |
  8. | p3 | store_id | MAXVALUE | 1 |
  9. +------+----------+----------+------------+
  10. 4 rows in set (0.01 sec)


删除分区

  1. alter table emp_date drop partition p2;


2  List分区


  1. CREATE TABLE expenses (
  2.   expense_date date NOT NULL,
  3.   category int(11) DEFAULT NULL,
  4.   amount decimal(10,3) DEFAULT NULL
  5. ) PARTITION BY LIST (category)
  6. (PARTITION p0 VALUES IN (3,5) ,
  7.  PARTITION p1 VALUES IN (1,10),
  8.  PARTITION p2 VALUES IN (4,9),
  9.  PARTITION p3 VALUES IN (2) ,
  10.  PARTITION p4 VALUES IN (6)
  11. );

增加分区和重定义分区

  1. alter table expenses add partition (partition p6 values in(11));

  2. alter table expenses reorganize partition p4,p5,p6 into(
  3. partition p4 values in (6,11),
  4. partition p5 values in (7,8)
  5. );


  1. mysql> show create table expenses\\G
  2. *************************** 1. row ***************************
  3.        Table: expenses
  4. Create Table: CREATE TABLE `expenses` (
  5.   `expense_date` date NOT NULL,
  6.   `category` int(11) DEFAULT NULL,
  7.   `amount` decimal(10,3) DEFAULT NULL
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1
  9. /*!50100 PARTITION BY LIST (category)
  10. (PARTITION p0 VALUES IN (3,5) ENGINE = InnoDB,
  11.  PARTITION p1 VALUES IN (1,10) ENGINE = InnoDB,
  12.  PARTITION p2 VALUES IN (4,9) ENGINE = InnoDB,
  13.  PARTITION p3 VALUES IN (2) ENGINE = InnoDB,
  14.  PARTITION p4 VALUES IN (6,11) ENGINE = InnoDB,
  15.  PARTITION p5 VALUES IN (7,8) ENGINE = InnoDB) */
  16. 1 row in set (0.00 sec)


3   Hash分区

  1. mysql> CREATE TABLE emp_hash ( id int not null , ename varchar(30), hired date not null default '1970-01-01', separated date not null default '9999-12-31', job varchar(30) not null, store_id int not null)partition by hash(store_id) partitions 4;
  2. Query OK, 0 rows affected (0.06 sec)


减少分区数为2

  1. mysql> alter table emp_hash coalesce partition 2;
  2. Query OK, 0 rows affected (0.18 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0

增加分区数(注意跟减少分区数命令不同)

  1. mysql> alter table emp_hash add partition partitions 8;
  2. Query OK, 0 rows affected (0.21 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0



4  key分区

用partition by key(expr) 子句来创建一个Key分区表,expr是零个或者多个字段名名的表:

  1. mysql> CREATE TABLE emp_key(
  2.     -> id int not null ,
  3.     -> ename varchar(30),
  4.     -> hired date not null default \'1970-01-01\',
  5.     -> separated date not null default \'9999-12-31\',
  6.     -> job varchar(30) not null,
  7.     -> stored_id int not null
  8.     -> )partition by key(job) partitions 4;
  9. Query OK, 0 rows affected (0.05 sec)


5  子分区

创建子分区

  1. mysql> create table ts(id int,purchased date) partition by range(year(purchased)) subpartition by hash(to_days(purchased)) subpartitions 2 ( partition p0 values less than (1990), partition p1 values less than (2000), partition p2 values less than MAXVALUE );
  2. Query OK, 0 rows affected (0.08 sec)


6 columns分区

columns分区可以细分为 range columns分区 和 list columns分区,这两种分区都支持整数、日期时间、字符串三大数据类型。columns分区最大亮点是支持多列分区。如下:
  1. CREATE TABLE rc3 (
  2.   a int(11) DEFAULT NULL,
  3.   b int(11) DEFAULT NULL
  4. ) PARTITION BY RANGE COLUMNS(a,b)
  5. (PARTITION p01 VALUES LESS THAN (0,10) ,
  6.  PARTITION p02 VALUES LESS THAN (10,10),
  7.  PARTITION p03 VALUES LESS THAN (10,20) ,
  8.  PARTITION p04 VALUES LESS THAN (10,35) ,
  9.  PARTITION p05 VALUES LESS THAN (10,MAXVALUE),
  10.  PARTITION p06 VALUES LESS THAN (MAXVALUE,MAXVALUE));

插入字段比较:

  1. mysql> select (1,10) < (10,10) from dual;
  2. +------------------+
  3. | (1,10) < (10,10) |
  4. +------------------+
  5. | 1 |
  6. +------------------+
  7. 1 row in set (0.00 sec)




  1. mysql> select partition_name part, partition_expression expr,partition_description descr, table_rows from information_schema.partitions where table_schema=schema() and table_name=\'rc3\';
  2. +------+---------+-------------------+------------+
  3. | part | expr | descr | table_rows |
  4. +------+---------+-------------------+------------+
  5. | p01 | `a`,`b` | 0,10 | 0 |
  6. | p02 | `a`,`b` | 10,10 | 2 |
  7. | p03 | `a`,`b` | 10,20 | 1 |
  8. | p04 | `a`,`b` | 10,35 | 0 |
  9. | p05 | `a`,`b` | 10,MAXVALUE | 0 |
  10. | p06 | `a`,`b` | MAXVALUE,MAXVALUE | 0 |
  11. +------+---------+-------------------+------------+
  12. 6 rows in set (0.01 sec)


 总结

本篇博客重点介绍MySQL的分区类型和常规管理维护命令,分区通过“分而治之”的方法管理数据库表,提高了数据处理的并行度从而能够提升性能。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26435490/viewspace-1266171/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: sql_mode
下一篇: 权限管理
请登录后发表评论 登录
全部评论

注册时间:2014-01-18

  • 博文量
    143
  • 访问量
    530075