mysql查分区数据_mysql之数据分区

本文介绍了MySQL中数据分区的概念,包括RANGE、LIST、HASH和KEY四种分区类型,并提供了详细的创建和查询分区表的示例。通过对不同分区类型的解释,展示了如何根据ID或特定字段的值将数据分布到不同的分区,从而优化查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

三:分区查询

语法:

SELECTselect_expr[, select_expr ...]

FROMtable_references[PARTITION partition_list] //指定分局

eg:select * from rc1 PARTITION(p0) ; //在标的引用后面加上PARTITION(p,...)函数,参数为表的分区名

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

四:RANGE分区

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

CREATE TABLE`tb_range` (-> `id` int(11) NOT NULL,-> `fname` varchar(30) DEFAULT NULL,-> `lname` varchar(30) DEFAULT NULL

->)-> PARTITION BYRANGE (id)-> (PARTITION p0 VALUES LESS THAN (6),-> PARTITION p1 VALUES LESS THAN (11),-> PARTITION p2 VALUESLESS THAN MAXVALUE ) ;

Query OK,0 rows affected (0.64sec)

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.02sec)

Records:4 Duplicates: 0 Warnings: 0

View Code

查询:

mysql> select * fromtb_range partition(p0); //查询p0区的数据+----+-------+-------+

| id | fname | lname |

+----+-------+-------+

| 1 | a1 | b1 |

+----+-------+-------+

1 row in set (0.00sec)

mysql> select * fromtb_range partition(p2);//查询p2区的数据+----+-------+-------+

| id | fname | lname |

+----+-------+-------+

| 20 | a20 | b20 |

+----+-------+-------+

1 row in set (0.00sec)

mysql> select * fromtb_range partition(p1);//查询p1区的数据+----+-------+-------+

| id | fname | lname |

+----+-------+-------+

| 6 | a6 | b6 |

| 10 | a10 | b10 |

+----+-------+-------+

2 rows in set (0.00 sec)

五:LIST 分区

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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 BYLIST(class_id) (-> PARTITION pNorth VALUES IN (1,3),-> PARTITION pEast VALUES IN (2,4)->);

Query OK,0 rows affected (0.47sec)

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)

View Code

查询:

mysql> select * fromtb_list partition(pEast);+----+-------+-------+----------+

| id | fname | lname | class_id |

+----+-------+-------+----------+

| 6 | a6 | b6 | 2 |

| 20 | a20 | b20 | 4 |

+----+-------+-------+----------+

2 rows in set (0.00sec)

mysql> select * fromtb_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散列算法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

mysql> CREATE TABLEtb_hash (-> id INT NOT NULL,-> fname VARCHAR(30),-> lname VARCHAR(30)->)-> PARTITION BYHASH(id)-> PARTITIONS 3;

Query OK,0 rows affected (0.56sec)

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.03sec)

Records:4 Duplicates: 0 Warnings: 0

View Code

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

mysql> select * fromtb_hash partition(p0);+----+-------+-------+

| id | fname | lname |

+----+-------+-------+

| 6 | a6 | b6 |

+----+-------+-------+

1 row in set (0.00sec)

mysql> select * fromtb_hash partition(p1);+----+-------+-------+

| id | fname | lname |

+----+-------+-------+

| 1 | a1 | b1 |

| 10 | a10 | b10 |

+----+-------+-------+

2 rows in set (0.00sec)

mysql> select * fromtb_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线性算法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

mysql> CREATE TABLEtb_hash_linear (-> id INT NOT NULL,-> fname VARCHAR(30),-> lname VARCHAR(30)->)-> PARTITION BYLINEAR HASH(id)-> PARTITIONS 3;

Query OK,0 rows affected (0.58 sec)

View Code

七:KEY 分区

mysql> CREATE TABLEtb_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文件。分析下图箭头

bca0936f680f5a99dd650e85976a49a8.png

有图可知:

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

我查看的数据库为:test3

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值