一:概述  通过把表分成多几区间,每个区间存储符合特定表达式的数据(即在我们创建分区表时指定每个分区存储的条件例如:PARTITION p0 VALUES LESS THAN (100) 即p0区间存储小于100的数据)。

二:分区类型

  即根据每个区间存储值的表达式不同,可分为如下几个类型,一般都是对数字类型或时间类型的数据进行分区。

2.1 RANGE分区 :即通过表达式 PARTITION p0 VALUES LESS THAN (100)  。即 less小于指定的值存储区间。

2.2 LIST 分区 :即通过表达式 PARTITION pNorth VALUES IN (3,5,6,9,17)  。即值在in括号里面的值存储区间。

2.3 HASH 分区 :即通过特定算法(hash)把指定的值放入不同区间。PARTITION BY HASH(id)  PARTITIONS 4。

2.4 KEY 分区: 和hash分区类似,但指定的列值必须是唯一值(即主键或 UNIQUE KEY),PARTITION BY KEY() PARTITIONS 2;

2.5 COLUMNS 分区:

三:分区查询

语法:

SELECT
select_expr [, select_expr ...]
FROM table_references
[PARTITION partition_list] //指定分局
eg:select * from rc1 PARTITION(p0) ; //在标的引用后面加上PARTITION(p,...)函数,参数为表的分区名

备注:如果我们查询没有添加分区条件,默认是查询所有分区

四:RANGE分区

 CREATE TABLE `tb_range` (
-> `id` int(11) NOT NULL,
-> `fname` varchar(30) DEFAULT NULL,
-> `lname` varchar(30) DEFAULT NULL
-> )
-> PARTITION BY RANGE (id)
-> (PARTITION p0 VALUES LESS THAN (6),
-> PARTITION p1 VALUES LESS THAN (11),
-> PARTITION p2 VALUES LESS THAN MAXVALUE ) ;
Query OK, 0 rows affected (0.64 sec) mysql> insert into tb_range(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20');
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 0

查询:

mysql> select * from tb_range partition(p0);  //查询p0区的数据
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 1 | a1 | b1 |
+----+-------+-------+
1 row in set (0.00 sec) mysql> select * from tb_range partition(p2);//查询p2区的数据
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 20 | a20 | b20 |
+----+-------+-------+
1 row in set (0.00 sec) mysql> select * from tb_range partition(p1);//查询p1区的数据
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 6 | a6 | b6 |
| 10 | a10 | b10 |
+----+-------+-------+
2 rows in set (0.00 sec)

五:LIST 分区

mysql> CREATE TABLE `tb_list` (
-> `id` int(11) NOT NULL,
-> `fname` varchar(30) DEFAULT NULL,
-> `lname` varchar(30) DEFAULT NULL,
-> `class_id` int(11) NOT NULL
-> )
-> PARTITION BY LIST(class_id) (
-> PARTITION pNorth VALUES IN (1,3),
-> PARTITION pEast VALUES IN (2,4)
-> );
Query OK, 0 rows affected (0.47 sec) mysql> insert into tb_list(id,fname,lname,class_id)values(1,'a1','b1',1),(6,'a6','b6',2),(10,'a10','b10',3),(20,'a20','b20',4);
Query OK, 4 rows affected (0.02 sec)

查询:

mysql> select * from tb_list partition(pEast);
+----+-------+-------+----------+
| id | fname | lname | class_id |
+----+-------+-------+----------+
| 6 | a6 | b6 | 2 |
| 20 | a20 | b20 | 4 |
+----+-------+-------+----------+
2 rows in set (0.00 sec) mysql> select * from tb_list partition(pNorth);
+----+-------+-------+----------+
| id | fname | lname | class_id |
+----+-------+-------+----------+
| 1 | a1 | b1 | 1 |
| 10 | a10 | b10 | 3 |
+----+-------+-------+----------+
2 rows in set (0.00 sec)

备注:list方式分区in()参数可以无需

   如果插入不存在的分区,数据库会报错

六:HASH 分区

6.1hash散列算法

mysql> CREATE TABLE tb_hash (
-> id INT NOT NULL,
-> fname VARCHAR(30),
-> lname VARCHAR(30)
-> )
-> PARTITION BY HASH(id)
-> PARTITIONS 3;
Query OK, 0 rows affected (0.56 sec) mysql> insert into tb_hash(id,fname,lname)values(1,'a1','b1'),(6,'a6','b6'),(10,'a10','b10'),(20,'a20','b20');
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 0 Warnings: 0

查询:默认分区为p0,p1....

mysql> select * from tb_hash partition(p0);
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 6 | a6 | b6 |
+----+-------+-------+
1 row in set (0.00 sec) mysql> select * from tb_hash partition(p1);
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 1 | a1 | b1 |
| 10 | a10 | b10 |
+----+-------+-------+
2 rows in set (0.00 sec) mysql> select * from tb_hash partition(p2);
+----+-------+-------+
| id | fname | lname |
+----+-------+-------+
| 20 | a20 | b20 |
+----+-------+-------+
1 row in set (0.01 sec)

 mysql> select * from tb_hash partition(p3);
  ERROR 1735 (HY000): Unknown partition 'p3' in table 'tb_hash'

6.2 hash线性算法

mysql> CREATE TABLE tb_hash_linear (
-> id INT NOT NULL,
-> fname VARCHAR(30),
-> lname VARCHAR(30)
-> )
-> PARTITION BY LINEAR HASH(id)
-> PARTITIONS 3;
Query OK, 0 rows affected (0.58 sec)

七:KEY 分区

mysql> CREATE TABLE tb_key (
-> id INT NOT NULL PRIMARY KEY,
-> name VARCHAR(20)
-> )
-> PARTITION BY KEY()
-> PARTITIONS 2;
Query OK, 0 rows affected (0.44 sec)

注意:我们数据库目录存放着我们所有数据库的信息,包括数据库中表的信息和表中数据。其中每个数据库会在该目录下创建一个以数据库名命名文件夹,该文件夹下主要包含.frm和.idb结尾的文件,其中.idb(一个表对应一个)文件存放着每个表的数据。如果我们的表是分区表则一个表对用多个.idb文件。分析下图箭头

 有图可知:

数据库目录 : /var/lib/mysql

我查看的数据库为:test3

普通表一个.frm和一个.idb 而分区表一个.frm和多个.idb文件

mysql之数据分区的更多相关文章

  1. 删除mysql数据库中表分区数据

    删除mysql数据库中表分区数据 zabbix 几个大表创建了分区,由于磁盘空间告警,特将3月前的分区给予删除. 1.查看表的数据占用磁盘空间情况 2.登录mysql中,查看表的分区情况. 3.删除表 ...

  2. [转] MySQL 查询表数据大小的总结

    一:关于mysql表数据大小 我们知道mysql存储数据文件一般使用表空间存储 当mysql使用innodb存储引擎的时候,mysql使用表存储数据分为共享表空间和独享表空间两种方式 ·共享表空间:I ...

  3. MySQL的表分区详解

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

  4. MySQL的表分区(转载)

    MySQL的表分区(转载) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  5. zabbix使用mysql数据库 对表分区

    zabbix删除历史数据 mysql 表自动分区.删除 ----2016年终总结 二 zabbix清理历史数据是个比较蛋疼的问题,尤其在监控数据较多时,一方面无法彻底释放历史数据空间,一方面数据库删除 ...

  6. MySQL 横向表分区之RANGE分区小结

    MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...

  7. 使用sqoop从mysql导入数据到hive

      目录 前言 一.使用的导入命令 二.遇到的问题及解决 1. 用文本字段进行分区的问题 2. Hadoop历史服务器Hadoop JobHistory没开启的问题 3. 连接元数据存储数据库报错 4 ...

  8. mysql 超大数据/表管理技巧

    如果你对长篇大论没有兴趣,也可以直接看看结果,或许你对结果感兴趣.在实际应用中经过存储.优化可以做到在超过9千万数据中的查询响应速度控制在1到20毫秒.看上去是个不错的成绩,不过优化这条路没有终点,当 ...

  9. MySql采用range分区可提升查询效率

    简介: RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区.在5.7版本中DATE.DATETIME列也可以使用RANGE分区,同时在5.5以上的版本提供了基于非整形的R ...

随机推荐

  1. Codeforces Round #437 B. Save the problem!

    题意: 给你一个方案数,要求你输出满足该条件的总金额,面值数,和各个面值是多少,答案有多个,随便输出一个即可. Examples Input 18 Output 30 41 5 10 25 Input ...

  2. jqGrid的userData的用法!!!

    在一次项目中想从后台自定义一些返回值传回jqGrid,所以就想到了jqGrid的这个userData属性,但是真的是坑了我好惨,这里记录一下! 1.首先看说明,这个jsonReader的默认配置,us ...

  3. [C++]字符串相关操作

    获取字符串长度 String str str.length(); //获取String类型字符串长度 str.size(); //STL获取容器中元素个数 Char* s strlen(s); //以 ...

  4. 365. Water and Jug Problem量杯灌水问题

    [抄题]: 简而言之:只能对 杯子中全部的水/容量-杯子中全部的水进行操作 You are given two jugs with capacities x and y litres. There i ...

  5. 浏览器DOM事件触发

    除用户人为交互触发事件外,用js脚本触发事件的一般流程为 创建事件 var e = Event('event_name', {key: value, ...}) 分发事件到 event.target ...

  6. swift 设置阴影和圆角

    1.正常view设置阴影 func setShadow(view:UIView,sColor:UIColor,offset:CGSize, opacity:Float,radius:CGFloat) ...

  7. MVC的SignalR例子

    # SignalR学习 ASP.NET SignalR 是为.NET 开发者提供即时通讯Web 应用的类库.即时通讯Web服务就是服务器将内容自动推送到已经连接的客户端,而不是服务器等待客户端发起一个 ...

  8. Python开发——解释器安装

    Python(解释器)安装 Windows 1.Python(解释器)下载链接 2.选择好安装路径,点击安装即可 3.环境变量配置 [右键计算机]-->[属性]-->[高级系统设置]--& ...

  9. 《笨方法学Python》加分题1

    1. 让你的脚本再多打印一行 我将这个题目理解为在脚本中增加一个空行,因此,在脚本中增加一条 print “\n”命令即可python中\为转义符,‘\n’为换行, ‘\t’是tab,‘\\’才是普通 ...

  10. 将小程序的logo换成属于自己的头像

    $logo = file_get_contents(IMG_URL.$logo); //根据头像的路径 $logo = yuanImg1($logo); //将头像改为圆形 $data = file_ ...