分区类型

RANGE分区
range分区的表是利用取值范围将数据分成分区,区间要连续并且不能互相重叠,使用values less than操作符进行分区定义

LIST分区
LIST分区是建立离散的值列表告诉数据库特定的值属于哪个分区,LIST分区在很多方面类似于RANGE分区,区别在LIST分区是从属于一个枚举列表的值得集合,RANGE分区是从属于一个连续区间值得集合。
LIST分区通过使用PARTITION BY LIST(expr)子句来实现,expr是某列值或一个局域某列值返回一个整数值得表达式,然后通过VALUES IN(value_list)的方式来定义分区,其中value_list是一个逗号分隔的整数列表。与RANGE分区不同,LIST分区不必声明任何特定顺序

HASH分区
HASH分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。对一个表执行HASH分区时,MySQL会对分区键应用一个散列函数,以此确定数据应当放在N个分区中的哪个分区
MySQL支持两种HASH分区,常规HASH分区和线性HASH分区(LINEAR HASH);常规HASH使用的是取模算法,线性HASH分区使用的是一个线性的2的幂的运算法则

Key分区
按照Key进行分区非常类似于按照HASH进行分区,只不过HASH分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL提供的HASH函数
数据库分区的一个非常常见的用途是按日期分离数据,一些数据库系统支持明确的日期分区,然而Mysql5.7并不支持(明确的)。然后使用DATE, TIME, or DATETIME 列来分区并不是什么难事儿,甚至基于表达式利用这样的列来创建分区。

当通过partition by KEY或LINEAR KEY的方式分区,你可以直接使用 DATE, TIME, or DATETIME column列作为分区键而不用对它们进行任何处理。

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY KEY(joined)
PARTITIONS 6;

创建一个存储过程插入一些数据
delimiter $$
drop procedure if exists pr_insertdate$$
create procedure pr_insertdate(in begindate date,in enddate date)
begin
    while begindate<enddate
    do
        insert into members values('fan','boshi','duyalan',null,begindate);
        set begindate = date_add(begindate,interval 1 day);
    end while;
end$$

delimiter ;

调用存储过程插入数据
mysql> call pr_insertdate('2015-01-01','2016-08-08');
Query OK, 1 row affected (0.06 sec)

mysql> select count(*) from  members;
+----------+
| count(*) |
+----------+
|      585 |
+----------+
1 row in set (0.00 sec)

查看数据分布
select
  partition_name part,
  partition_expression expr,
  partition_description descr,
  table_rows
from information_schema.partitions  where
  table_schema = schema()
  and table_name='members';

+------+----------+-------+------------+
| part | expr     | descr | table_rows |
+------+----------+-------+------------+
| p0   | `joined` | NULL  |        177 |
| p1   | `joined` | NULL  |          0 |
| p2   | `joined` | NULL  |        208 |
| p3   | `joined` | NULL  |          0 |
| p4   | `joined` | NULL  |        200 |
| p5   | `joined` | NULL  |          0 |
+------+----------+-------+------------+
6 rows in set (0.00 sec)
然而根据我的实验这种分区貌似没什么卵子用,p1 p3 p5都用不上。这种分区方法也不能很好地利用分区裁剪特性

MySQL 5.6也支持 DATE or DATETIME 类型列进行range和list分区

CREATE TABLE members_year (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);
普通的range和list分区还是要被分区键列转换成整型

创建一个可以传入表名的过程,用到了prepare statement,因为表名无法作为参数传递
delimiter $$
drop procedure if exists pr_insertdate_1$$
create procedure pr_insertdate_1(in begindate date,in enddate date,in tabname varchar(40))
begin
    while begindate<enddate
    do
        set @s=concat_ws(' ','insert into',tabname,'values(''fan'',''boshi'',''duyalan'',null,''',begindate,''')');
        prepare stmt from @s;
        execute stmt;
        drop prepare stmt;
        set begindate = date_add(begindate,interval 1 day);
    end while;
end$$

delimiter ;

调用存储过程插入数据
mysql> call pr_insertdate_1('1960-01-01','1990-12-31','members_mon');
Query OK, 0 rows affected (3.17 sec)

mysql> select count(*) from members_year;
+----------+
| count(*) |
+----------+
|    11322 |
+----------+
1 row in set (0.01 sec)

查看数据分布
select
  partition_name part,
  partition_expression expr,
  partition_description descr,
  table_rows
from information_schema.partitions  where
  table_schema = schema()
  and table_name='members_year';

+------+---------------+----------+------------+
| part | expr          | descr    | table_rows |
+------+---------------+----------+------------+
| p0   |  YEAR(joined) | 1960     |          0 |
| p1   |  YEAR(joined) | 1970     |       3653 |
| p2   |  YEAR(joined) | 1980     |       3652 |
| p3   |  YEAR(joined) | 1990     |       3653 |
| p4   |  YEAR(joined) | MAXVALUE |        364 |
+------+---------------+----------+------------+

查看是否可以使用到分区裁剪特性
mysql> explain partitions select * from members_year where joined='1970-02-01';
+----+-------------+--------------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table        | partitions | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------------+------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | members_year | p2         | ALL  | NULL          | NULL | NULL    | NULL | 3652 | Using where |
+----+-------------+--------------+------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

Mysql --分区表(2)的更多相关文章

  1. MySQL 分区表

    转载自MySQL 分区表 今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看, ...

  2. Mysql --分区表的管理与维护

    改变一个表的分区方案只需使用alter table 加 partition_options 子句就可以了.和创建分区表时的create table语句很像 创建表 CREATE TABLE trb3 ...

  3. 数据切分——Mysql分区表的管理与维护

    关于Mysql分区表的介绍可以参考: http://blog.csdn.net/jhq0113/article/details/44592865 关于Mysql分区表的创建可以参考: http://b ...

  4. 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...

  5. MySQL分区表基础

    首先要确定MySQL是否支持分区: Mysql> SHOW VARIABLES LIKE '%partition%'; +-----------------------+-------+| Va ...

  6. (3) MySQL分区表使用方法

    1. 确认MySQL服务器是否支持分区表 命令: show plugins; 2. MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(HASH) HASH分区的特点 根 ...

  7. MySQL 分区表原理及数据备份转移实战

    MySQL 分区表原理及数据备份转移实战 1.分区表含义 分区表定义指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现 ...

  8. MYSQL分区表功能测试简析

    1.查看Mysql版本是否支持分区  SHOW VARIABLES LIKE '%partition%';   +-------------------+-------+ | Variable_nam ...

  9. 详解MySQL分区表

    当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种: 1.分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多. 优点:提高并发量,减小锁的 ...

  10. MySQL分区表使用方法

    原文:MySQL分区表使用方法 1. 确认MySQL服务器是否支持分区表 命令: show plugins; 2. MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(H ...

随机推荐

  1. JAVA设计模式之合成模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...

  2. delphi控件属性和事件

    常用[属性]  Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令  Anchors:与组件连接的窗体的位置点  Align:确定组件的对齐方式  AutoSize:确定组件是否自动 ...

  3. 【转】对抗拖库 ―― Web 前端慢加密

    0×00 前言 天下武功,唯快不破.但密码加密不同.算法越快,越容易破. 0×01 暴力破解 密码破解,就是把加密后的密码还原成明文密码.似乎有不少方法,但最终都得走一条路:暴力穷举.也许你会说还可以 ...

  4. linux 搭建 nexus 私服及配置

    安装篇 1.tar -zxvf nexus-latest-bundle.tar.gz 2.cd nexus-2.13.0-01/bin 3../nexus start 这时可能提示 ********* ...

  5. swift 存储属性和计算属性 set{}和get{} didSet{}和willSet{}

    首先我们看一段代码: var A:Int = 0 var B:Int = 0 var C:Int { get { return 1 } set { print("Recived new va ...

  6. java中常用数据类型转换器

    /** * 把String转换成long * * @param src 要转换的String * @param def 转换失败时返回此值 * @return 转换好的long */ public s ...

  7. 32、shiro框架入门3.授权

    一. 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permission ...

  8. 登陆mysql时出现unknown variable 'character_set_client=UTF8' 的错误

    今天,登陆数据库服务器的时候,出现了下面的错误: [root@localhost app]# mysql -uroot -p mysql: unknown variable 'character-se ...

  9. Add Binary <leetcode>

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  10. [转]linux /proc/cpuinfo 文件分析

    在Linux系统中,提供了proc文件系统显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到.本文章针对该文件进行简单的总结. 基于不同指 ...