Mysql --分区表(5)Columns分区
COLUMNS分区
COLUMNS分区是RANGE和LIST分区的变种。COLUMNS分区支持多列作为分区键进行分区
RANGE COLUNMS分区和LIST COLUMNS都支持非INT型列作为分区键:
1.所有数据类型: TINYINT, SMALLINT, MEDIUMINT, INT (INTEGER), and BIGINT. (This is the same as with partitioning by RANGE and LIST.)
Decimal和Float不被支持
2.日期类型:date和datetime
3.字符类型: CHAR, VARCHAR, BINARY, and VARBINARY.
TEXT和BLOB不支持
RANGE COLUMNS分区
RANGE COLUMNS分区和RANGE分区的几点区别:
1.RANGE COLUMNS分区键不支持使用表达式,只可以使用列名
2.RANGE COLUMNS可以支持多列作为分区键进行分区
3.RANGE COLUMNS分区是基于元组进行比较的
4.RANGE COLUMNS分区不仅仅限于使用整数型列作为分区键,date和datetime列也可以
Culumns分区支持非整数分区,这样创建日期分区就不需要通过函数进行转换了。
CREATE TABLE members_mon (
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 COLUMNS(joined) (
PARTITION p0 VALUES LESS THAN ('2016-02-01'),
PARTITION p1 VALUES LESS THAN ('2016-03-01'),
PARTITION p2 VALUES LESS THAN ('2016-04-01'),
PARTITION p3 VALUES LESS THAN ('2016-05-01'),
PARTITION p4 VALUES LESS THAN ('2016-06-01'),
PARTITION p5 VALUES LESS THAN ('2016-07-01'),
PARTITION p6 VALUES LESS THAN ('2016-08-01'),
PARTITION p7 VALUES LESS THAN ('2016-09-01'),
PARTITION p8 VALUES LESS THAN ('2016-10-01'),
PARTITION p9 VALUES LESS THAN ('2016-11-01'),
PARTITION p10 VALUES LESS THAN ('2016-12-01'),
PARTITION p11 VALUES LESS THAN ('2017-01-01'),
PARTITION p12 VALUES LESS THAN MAXVALUE
);
call pr_insertdate_1('2016-01-01','2016-12-31','members_mon');
select
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
from information_schema.partitions where
table_schema = schema()
and table_name='members_mon';
+------+----------+--------------+------------+
| part | expr | descr | table_rows |
+------+----------+--------------+------------+
| p0 | `joined` | '2016-02-01' | 31 |
| p1 | `joined` | '2016-03-01' | 29 |
| p2 | `joined` | '2016-04-01' | 31 |
| p3 | `joined` | '2016-05-01' | 30 |
| p4 | `joined` | '2016-06-01' | 31 |
| p5 | `joined` | '2016-07-01' | 30 |
| p6 | `joined` | '2016-08-01' | 31 |
| p7 | `joined` | '2016-09-01' | 31 |
| p8 | `joined` | '2016-10-01' | 30 |
| p9 | `joined` | '2016-11-01' | 31 |
| p10 | `joined` | '2016-12-01' | 30 |
| p11 | `joined` | '2017-01-01' | 30 |
| p12 | `joined` | MAXVALUE | 0 |
+------+----------+--------------+------------+
13 rows in set (0.00 sec)
mysql> explain partitions select * from members_mon where joined='2016-02-01';
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | members_mon | p1 | ALL | NULL | NULL | NULL | NULL | 29 | Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+-------------+
RANGE Culumns分区还支持多列分区
create table rc3(
a int,
b int
)
partition by range columns(a,b)(
partition p01 values less than (0,10),
partition p02 values less than (10,10),
partition p03 values less than (10,20),
partition p04 values less than (10,35),
partition p05 values less than (10,MAXVALUE),
partition p06 values less than (MAXVALUE,MAXVALUE)
);
需要注意的是,RANGE Culumns分区键的比较是基于元组的比较,也就是基于字段组的比较,这和之前RANGE分区键的比较有些差异,我们写入几条测试数据并观察测试数据的分区情况来看一看
写入a=1,b=10的记录,实际写入了p02分区,也即是说元组(1,10)<(10,10)
mysql> insert into rc3 values(1,10);
Query OK, 1 row affected (0.00 sec)
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';
+------+---------+-------------------+------------+
| part | expr | descr | table_rows |
+------+---------+-------------------+------------+
| p01 | `a`,`b` | 0,10 | 0 |
| p02 | `a`,`b` | 10,10 | 1 |
| p03 | `a`,`b` | 10,20 | 0 |
| p04 | `a`,`b` | 10,35 | 0 |
| p05 | `a`,`b` | 10,MAXVALUE | 0 |
| p06 | `a`,`b` | MAXVALUE,MAXVALUE | 0 |
+------+---------+-------------------+------------+
6 rows in set (0.00 sec)
mysql> select (9,34)<(10,10);
+----------------+
| (9,34)<(10,10) |
+----------------+
| 1 |
+----------------+
1 row in set (0.00 sec)
所以insert into rc3 values(9,34);将被插入p02
LIST COLUMNS分区
支持非整型列作为分区键:
字符类型
CREATE TABLE customers_1 (
first_name VARCHAR(25),
last_name VARCHAR(25),
street_1 VARCHAR(30),
street_2 VARCHAR(30),
city VARCHAR(15),
renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Högsby', 'Mönsterås'),
PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Västervik'),
PARTITION pRegion_3 VALUES IN('Nässjö', 'Eksjö', 'Vetlanda'),
PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Växjo')
);
date datetime类型
CREATE TABLE customers_2 (
first_name VARCHAR(25),
last_name VARCHAR(25),
street_1 VARCHAR(30),
street_2 VARCHAR(30),
city VARCHAR(15),
renewal DATE
)
PARTITION BY LIST COLUMNS(renewal) (
PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
'2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
'2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
'2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
'2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
);
不过使用LIST COLUMNS分区进行按时间分区并不太好,还是RANGE COLUMNS好些
CREATE TABLE customers_3 (
first_name VARCHAR(25),
last_name VARCHAR(25),
street_1 VARCHAR(30),
street_2 VARCHAR(30),
city VARCHAR(15),
renewal DATE
)
PARTITION BY RANGE COLUMNS(renewal) (
PARTITION pWeek_1 VALUES LESS THAN('2010-02-09'),
PARTITION pWeek_2 VALUES LESS THAN('2010-02-15'),
PARTITION pWeek_3 VALUES LESS THAN('2010-02-22'),
PARTITION pWeek_4 VALUES LESS THAN('2010-03-01')
);
Mysql --分区表(5)Columns分区的更多相关文章
- MySQL 分区表,为什么分区键必须是主键的一部分?
随着业务的不断发展,数据库中的数据会越来越多,相应地,单表的数据量也会越到越大,大到一个临界值,单表的查询性能就会下降. 这个临界值,并不能一概而论,它与硬件能力.具体业务有关. 虽然在很多 MySQ ...
- mysql分区表之一:分区原理和优缺点【转】
1.分区表的原理 分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分 ...
- Mysql --分区表(7)Key分区
Key分区 按照Key进行分区非常类似于按照Hash进行分区,只不过Hash分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL服务器提供的HASH函数;同时H ...
- Mysql --分区表(6)Hash分区
HASH分区 HASH分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布.对一个表执行HASH分区时,MySQL会对分区键应用一个散列函数,以此确定数据应当放在N个分区中的哪个分区 ...
- MySQL分区表例子——List分区
列表分区(List分区) 这里假设表中有一个sale_item_type 字段,数据类型为INT 型 当sale_item_type 为1,3,5的时候,作为一个分区 当sale_item_type ...
- MySQL COLUMNS分区
200 ? "200px" : this.width)!important;} --> 介绍 COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIS ...
- mysql分区表之二:MySQL的表的四种分区类型介绍
一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- [MySQL Reference Manual] 20 分区
20 分区 20 分区 20.1 MySQL的分区概述 20.2 分区类型 20.2.1 RANGE分区 20.2.2 LIST分区 20.2.3 COLUMNS分区 20.2.3.1 RANGE C ...
- MySQL 分区表
转载自MySQL 分区表 今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看, ...
随机推荐
- php使用递归计算目录大小
本文章向大家介绍php如何计算某个目录的大小(多少kb,多少兆m),主要使用filesize函数配合递归函数的方法来实现,需要的朋友可以参考一下本文章的源代码.php使用递归计算目录大小,主要使用fi ...
- [翻译]用神经网络做回归(Using Neural Networks With Regression)
本文英文原文出自这里, 这个博客里面的内容是Java开源, 分布式深度学习项目deeplearning4j的介绍学习文档. 简介: 一般来说, 神经网络常被用来做无监督学习, 分类, 以及回归. 也就 ...
- ini 文件
INI文件是一个无固定标准格式的配置文件.它以简单的文字与简单的结构组成,常常使用在视窗操作系统,或是其他操作系统上,许多程序也会采用INI文件做为设置程序之用.视窗操作系统后来以注册表的形式替换掉I ...
- NHibernate系列文章十四:NHibernate事务
摘要 NHibernate实现事务机制非常简单,调用ISession.BeginTransaction()开启一个事务对象ITransaction,使用ITransaction.Commit()提交事 ...
- linux grep命令详解
linux grep命令详解 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来 ...
- Python2和Python3在windows下共存
Python2.7 和 Python3不兼容,两种环境可能都会用到.ubuntu14.04中已经默认安装了这两个版本,在shell中输入python会自动进入Python2.7的交互环境,输入Pyth ...
- jQuery 屏幕遮罩
1.先做一个可以覆盖整个屏幕的div,颜色为黑色,然后再设置透明度,作为遮罩#zhezhao { position: absolute; top: 0px; left: 0px; width: 100 ...
- 把svn上的mycelipse导到本地的eclipse中
myeclipse和eclipse的web项目互导时会产生各种问题,现在把我遇到的情况记录如下: eclipse如何把svn上down下来的myeclipseWeb项目变成eclipse的Web项目: ...
- [转]深入分析 Java 中的中文编码问题
收益匪浅,所以转发至此 原文链接: http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ 深入分析 Java 中的中文编码问题 编 ...
- CCKJ 笔试
面向对象三个特性: 面向对象技术是目前流行的系统设计开发技术,它包括面向对象分析和面向对象程序设计.面向对象程序设计技术的提出,主要是为了解决传统程序设计方法--结构化程序设计所不能解决的代码重用问题 ...