Mysql分区技术 --创建分区表

分区的作用:数据库性能的提升和简化数据管理

在扫描操作中,mysql优化器只扫描保护数据的那个分区以减少扫描范围获得性能的提高。
分区技术使得数据管理变得简单,删除某个分区不会对另外的分区造成影响,分区有系统直接管理不用手工干预。

查询当前的mysql数据库版本是否支持分区
show variables like ‘%partition%‘;

分区类型
【RANGE 分区】:
基于属于一个给定连续区间的列值,把多行分配给分区。

【LIST 分区】:
类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

【HASH分区】:
基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

【KEY分区

分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

【复合分区】:RANGE—HASH,    LIST—HASH,   RANGE—Key,     LIST—Key

[[email protected] ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.28 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> exit
Bye
[[email protected] ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.28 Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> show variables like ‘%partition%‘;
Empty set (0.00 sec)
【RANGE 分区】: 
 mysql> create table emp_age_range

-> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> age int
    -> )
    -> partition by range(age)
    -> (
    -> partition p1 values less than (10),
    -> partition p2 values less than (20),
    -> partition p3 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.80 sec)

mysql> create table emp_birthdate_range
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by range(year(birthdate))
    -> (
    -> partition p1 values less than (1980),
    -> partition p2 values less than (1990),
    -> partition p3 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.50 sec)
【LIST 分区】 
 mysql> create table emp_deptno_list
  -> (empno  varchar(20) not null ,

-> empname varchar(20),
    -> deptno  int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by list(deptno)
    -> (
    -> partition p1 values in  (10),
    -> partition p2 values in  (20),
    -> partition p3 values  in  (30)
    -> );
Query OK, 0 rows affected (0.66 sec)

【HASH分区】
 
mysql> create table emp_birthday_hash
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by hash(year(birthdate))
    -> partitions 4;
Query OK, 0 rows affected (0.41 sec)

【KEY分区
 
mysql> create table emp_birthdate_key

-> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by key(birthdate)
    -> partitions 4;
Query OK, 0 rows affected (1.00 sec)

【复合分区】
 
mysql> create table emp_birthdate_range_hash
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by range(salary)
    -> subpartition by hash(year(birthdate))
    -> subpartitions 3
    -> (
    -> partition p1 values less than (2000),
    -> partition p2 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.56 sec)

mysql> create table emp_salary_range_key
    -> (empno varchar(20) not null ,
    -> empname varchar(20),
    -> deptno int,
    -> birthdate date not null,
    -> salary int
    -> )
    -> partition by range(salary)
    -> subpartition by key(birthdate)
    -> subpartitions 3
    -> (
    -> partition p1 values less than (2000),
    -> partition p2 values less than maxvalue
    -> );
Query OK, 0 rows affected (0.62 sec)

mysql> CREATE TABLE emp_birthdate_list_hash (
    -> empno varchar(20) NOT NULL,
    -> empname varchar(20) ,
    -> deptno int,
    -> birthdate date NOT NULL,
    -> salary int
    -> 
    -> )
    -> PARTITION BY list (deptno)
    -> subpartition by hash(year(birthdate))
    -> subpartitions 3
    -> (
    -> PARTITION p1 VALUES in  (10),
    -> PARTITION p2 VALUES in  (20)
    -> );
Query OK, 0 rows affected (0.55 sec)

mysql> CREATE TABLE emp_list_key (
    -> empno varchar(20) NOT NULL,
    -> empname varchar(20) ,
    -> deptno int,
    -> birthdate date NOT NULL,
    -> salary int
    -> )
    -> PARTITION BY list (deptno)
    -> subpartition by key(birthdate)
    -> subpartitions 3
    -> (
    -> PARTITION p1 VALUES in  (10),
    -> PARTITION p2 VALUES in  (20)
    -> );
Query OK, 0 rows affected (0.88 sec)

mysql> show tables;
+--------------------------+
| Tables_in_test           |
+--------------------------+
| emp_age_range            |
| emp_birthdate_key        |
| emp_birthdate_list_hash  |
| emp_birthdate_range      |
| emp_birthdate_range_hash |
| emp_birthday_hash        |
| emp_deptno_list          |
| emp_list_key             |
| emp_salary_range_key     |
+--------------------------+
9 rows in set (0.00 sec)

1.可以查看创建分区表的create语句   show create table 表名
2.可以查看表是不是分区表      show table status 
3.查看information_schema.partitions表 ,可以查看表具有哪几个分区、分区的方法、分区中数据的记录数等信息
select 
  *
from information_schema.partitions  where 
  table_schema = schema()  
  and table_name=‘test‘;  
4.查看SQL执行计划,explain partitions select语句
通过此语句来显示扫描哪些分区,及他们是如何使用的.
mysql> desc emp_age_range;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| empno   | varchar(20) | NO   |     | NULL    |       |
| empname | varchar(20) | YES  |     | NULL    |       |
| deptno  | int(11)     | YES  |     | NULL    |       |
| age     | int(11)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql>  show create table emp_age_range;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table                                                                                                                                                                                                                                                                                                                                                                                                      |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| emp_age_range | CREATE TABLE `emp_age_range` (
  `empno` varchar(20) NOT NULL,
  `empname` varchar(20) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (age)
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

mysql> select 
    ->   partition_name part,  
    ->   partition_expression expr,  
    ->   partition_description descr,  
    ->   table_rows  
    -> from information_schema.partitions  where 
    ->   table_schema = schema()  ;
+------+-----------------+----------+------------+
| part | expr            | descr    | table_rows |
+------+-----------------+----------+------------+
| p1   | age             | 10       |          0 |
| p2   | age             | 20       |          0 |
| p3   | age             | MAXVALUE |          0 |
| p0   | `birthdate`     | NULL     |          0 |
| p1   | `birthdate`     | NULL     |          0 |
| p2   | `birthdate`     | NULL     |          0 |
| p3   | `birthdate`     | NULL     |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p1   | year(birthdate) | 1980     |          0 |
| p2   | year(birthdate) | 1990     |          0 |
| p3   | year(birthdate) | MAXVALUE |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p0   | year(birthdate) | NULL     |          0 |
| p1   | year(birthdate) | NULL     |          0 |
| p2   | year(birthdate) | NULL     |          0 |
| p3   | year(birthdate) | NULL     |          0 |
| p1   | deptno          | 10       |          0 |
| p2   | deptno          | 20       |          0 |
| p3   | deptno          | 30       |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p1   | deptno          | 10       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p2   | deptno          | 20       |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p1   | salary          | 2000     |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
| p2   | salary          | MAXVALUE |          0 |
+------+-----------------+----------+------------+
41 rows in set (0.01 sec)

mysql> select 
    ->   *
    -> from information_schema.partitions  where 
    ->   table_schema = schema()  ;

获取【下载地址】 企业框架源码

时间: 2025-01-17 01:33:42

Mysql分区技术 --创建分区表的相关文章

MySQL分区技术 (一)

4:MySQL 分区技术(是mysql 5.1以版本后开始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 目前,针对海量数据的优化主要有2中方法: 1:大表拆成小表的方式(物理上) 一:垂直分表->一张垂直切成几张 二:水平分表(一般重点)->横切,意思就是一张表有100个数据横切10张表,一张表存10条(字段一致) 2:SQL语句的优化(可以通过增加索引等来调整,但是数据量大的增大会导致索引的维护代价增大) 水平分区技术将一个表拆成多个表,比较常用的方式

mysql分区技术

mysql分区技术在物理存储上使数据表进行分离,逻辑上还是一张表 mysql5.1以上版本有5种分区类型 RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择. HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算.这个函数可以包含MySQL 中有效的.产生非负整数值的任何表达式. KEY 分区:类似于按HASH分区

MYSQL优化_MYSQL分区技术[转载]

MySQL分区技术是用来减轻海量数据带来的负担,解决数据库性能下降问题的一种方式,其他的方式还有建立索引,大表拆小表等等.MySQL分区按照分区的参考方式来分有RANGE分区.LIST分区.HASH分区.KEY分区.本文对这几种分区方式进行了详细的介绍,并且给出了简单的示例,文章简洁明了,对于想要初步了解MySQL分区技术的同学来说是很不错的参考材料. 一.背景介绍 当 MySQL中一个表的总记录数超过了1000万,会出现性能的大幅度下降吗?答案是肯定的.但性能下降的比率由系统的架构.应用程序.

SQL Server 2008如何创建分区表,并压缩数据库空间

1.什么是分区表 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性.分区表是把数据按设定的标准划分成区域存储在不同的文件组中,使用分区可以快速而有效管理和访问数据子集. 适合做分区表的情况 ? 数据库中某个表的数据很多,在查询数据时会明显感觉到速度很慢,这个时候需要考虑分区表: ? 数据是分段的,如以年份为分隔的数据,对于当年的数据经常进行增删改查操作,而对于往年的数据几乎不做操作或只

mysql 表分区技术

表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看,只有一张表,但是底层却是由多个物理分区组成. 表分区有什么好处: a.分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备. b.和单个磁盘或者文件系统相比,可以存储更多数据 c.优化查询.在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率:涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果.d.分区表更容易维护.例如:想批量删除大量数据可以清除整个

创建分区表(按照年份分区,自动新增分区)

创建分区表AAA,通过字段创建时间的年份来分区,分区表自动根据插入的数据新增对应的分区,不过此处自动创建的分区名称为系统创建的,如:SYS_24. CREATE TABLE AAA ( ID NUMBER(8), CREATETIME DATE, VALUE NUMBER(8) ) PARTITION BY RANGE(CREATETIME) INTERVAL(NUMTOYMINTERVAL(1,'YEAR')) ( PARTITION P2014 VALUES LESS THAN(TO_DAT

创建分区表2:对已经存在的表进行分区

Sql Server 支持对一个已经存在的表进行分区. -- create parition function CREATE PARTITION FUNCTION pf_int_Left (int) AS RANGE LEFT FOR VALUES (10,20); --determine partition number select $Partition.pf_int_left(21) CREATE PARTITION SCHEME PS_int_Left AS PARTITION pf_i

mysql分区和分表

mysql分表和分区 1.mysql分表 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,MYI索引文件,frm表结构文件.如果是Innodb存储引擎,索引文件和数据文件存放在同一个位置.这些表可以分布在同一块磁盘上,也可以在不同的机器上. app读写的时候根据事先定义好的规则得到对应的的表明,然后去操作它. 将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法(如用hash的方式,也可以用取余的方式)

mysql分区交换exchange partition

在表和分区间交换数据 mysql5.6开始支持alter table..exchange partition语法,该语句允许分区或子分区中的数据与另一个非分区的表中的数据进行交换,如果非分区表中的数据为空,那么相当于将分区中的数据移动到非分区表中,若分区表中的数据为空,则相当于将外部表中的数据导入到分区中,即,哪边不为空,哪边就是被移出的,哪边为空,哪边就是装数据的.   要使用alter table…exchange partition语句,必须满足下面的条件: A:要交换的表需要和分区表有着