mysql之数据分区

一:概述  通过把表分成多几区间,每个区间存储符合特定表达式的数据(即在我们创建分区表时指定每个分区存储的条件例如: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 分区:

三:分区查询

语法:

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

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

四:RANGE分区

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

View Code

查询:

1mysql> select * from tb_range partition(p0); //查询p0区的数据 2+----+-------+-------+ 3| id | fname | lname | 4+----+-------+-------+ 5| 1 | a1 | b1 | 6+----+-------+-------+ 71 row in set (0.00 sec) 8 9mysql> select * from tb_range partition(p2);//查询p2区的数据 10+----+-------+-------+ 11| id | fname | lname | 12+----+-------+-------+ 13| 20 | a20 | b20 | 14+----+-------+-------+ 151 row in set (0.00 sec) 16 17mysql> select * from tb_range partition(p1);//查询p1区的数据 18+----+-------+-------+ 19| id | fname | lname | 20+----+-------+-------+ 21| 6 | a6 | b6 | 22| 10 | a10 | b10 | 23+----+-------+-------+ 242 rows in set (0.00 sec)

五:LIST 分区 

1mysql> CREATE TABLE `tb_list` ( 2 -> `id` int(11) NOT NULL, 3 -> `fname` varchar(30) DEFAULT NULL, 4 -> `lname` varchar(30) DEFAULT NULL, 5 -> `class_id` int(11) NOT NULL 6 -> ) 7 -> PARTITION BY LIST(class_id) ( 8 -> PARTITION pNorth VALUES IN (1,3), 9 -> PARTITION pEast VALUES IN (2,4) 10 -> ); 11Query OK, 0 rows affected (0.47 sec) 12 13mysql> 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); 14Query OK, 4 rows affected (0.02 sec)

View Code

查询:

1mysql> select * from tb_list partition(pEast); 2+----+-------+-------+----------+ 3| id | fname | lname | class_id | 4+----+-------+-------+----------+ 5| 6 | a6 | b6 | 2 | 6| 20 | a20 | b20 | 4 | 7+----+-------+-------+----------+ 82 rows in set (0.00 sec) 9 10mysql> select * from tb_list partition(pNorth); 11+----+-------+-------+----------+ 12| id | fname | lname | class_id | 13+----+-------+-------+----------+ 14| 1 | a1 | b1 | 1 | 15| 10 | a10 | b10 | 3 | 16+----+-------+-------+----------+ 172 rows in set (0.00 sec)

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

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

六:HASH 分区

6.1hash散列算法

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

View Code

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

1mysql> select * from tb_hash partition(p0); 2+----+-------+-------+ 3| id | fname | lname | 4+----+-------+-------+ 5| 6 | a6 | b6 | 6+----+-------+-------+ 71 row in set (0.00 sec) 8 9mysql> select * from tb_hash partition(p1); 10+----+-------+-------+ 11| id | fname | lname | 12+----+-------+-------+ 13| 1 | a1 | b1 | 14| 10 | a10 | b10 | 15+----+-------+-------+ 162 rows in set (0.00 sec) 17 18mysql> select * from tb_hash partition(p2); 19+----+-------+-------+ 20| id | fname | lname | 21+----+-------+-------+ 22| 20 | a20 | b20 | 23+----+-------+-------+ 241 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线性算法

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

View Code

七:KEY 分区

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

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

 有图可知:

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

我查看的数据库为:test3

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''