高性能可扩展mysql 笔记(三)Hash分区、RANGE分区、LIST分区

个人博客网:https://wushaopei.github.io/    (你想要这里多有)

一、MySQL分区表操作

1、定义:数据库表分区是数据库基本设计规范之一,分区表在物理上表现为多个文件,在逻辑上表现为一个表;

2、表分区的弊端: 要谨慎选择分区键,错误的操作可能导致跨分区查询效率降低。

  建议 采用物理分表的方式管理大数据。

3、确认MySQL服务器是否支持分区表

  使用 SHOW PLUGINS;在mysql命令行查看是否具有分区表的功能:

                          

查询结果中的"partition                | ACTIVE   | STORAGE ENGINE     | NULL    | GPL   "这一行代表当前数据库可以进行数据库分区表操作。

4、普通数据库表的物理结构与分区表的物理结构的区别:

                        

左边为普通表的物理结构,右边为分区后的数据库表物理结构。

一、Hash分区表 (按HASH分区)

1、HASH分区的特点

 根据MOD(分区键,分区数)的值把数据行存储到表的不同分区中,使数据可以平均的分布在各个分区中。

注意: HASH分区的键值必须是一个INT类型的值,或是通过函数可以转为INT类型。

2、创建HASH分区:

use hash;
CREATE TABLE `hash`.`customer_login_log`(
	customer_id int UNSIGNED not null,
	login_time TIMESTAMP,
	login_ip int UNSIGNED,
	login_type TINYINT NOT NULL
) PARTITION by hash(login_ip) PARTITIONS 6;

查看 customer_login_log 分区表物理结构:

                   

customer_login_log 普通非分区表物理结构:

                   

向HASH分区表customer_login_log中插入数据:

INSERT INTO customer_login_log(customer_id,login_time,login_ip,login_type)
VALUES (1,now(),11111,1);

查看分区表数据:

                  

二、RANGE 分区表(按范围分区)

1、RANGE分区特点:

 RANGE分区 是根据分区键值的范围把数据行存储到表的不同分区中,并且 多个分区的范围要连续,但是不能重叠

注意: 默认情况下使用VALUES LESS THAN属性,即每个分区不包括指定的那个值

2、创建RANGE分区表:

create table `customer_login_log`(
 `customer_id` int(10) UNSIGNED not null,
 `login_time` TIMESTAMP not null,
 `login_ip` int(10) UNSIGNED not null,
 `login_type` TINYINT(4) NOT NULL
) ENGINE=INNODB
PARTITION BY RANGE( customer_id)(
	 PARTITION P0 VALUES LESS THAN (10000),
   PARTITION P1 VALUES LESS THAN (20000),
   PARTITION P2 VALUES LESS THAN (30000),
   PARTITION P3 VALUES LESS THAN MAXVALUE
)

 

 分区范围说明:             

当插入的数据为30000到40000分区范围的数据时,没有创建分区范围为40000的分区的情况下,会返回错误提示;但,当存在图中p3分区的MAXVALUE这一分区时,所以没有指明分区范围的数据都会被插入到p3中

3、RANGE分区的使用场景

  •  分区键为日期或是时间类型
  •  所有查询中都包括分区键
  • 定期按分区范围清理历史数据

三、List分区(按分区键取值分区)

1、LIST分区的特点

 定义: LIST分区按分区键取值的列表进行分区,并且同范围分区一样,各分区的列表只不能重复

注意:每一行数据必须能找到对应 分区列表,否则数据插入失败

2、创建LIST分区表:

create table `customer_login_log_list`(
 `customer_id` int(10) UNSIGNED not null,
 `login_time` TIMESTAMP not null,
 `login_ip` int(10) UNSIGNED not null,
 `login_type` TINYINT(4) NOT NULL
) ENGINE=INNODB
PARTITION BY LIST (login_type)(
	PARTITION P0 VALUES IN (1,3,5,7,9),
	PARTITION P1 VALUES IN (2,4,6,8)
)

插入包含未建立分区的分区键的值,会返回错误:

INSERT INTO customer_login_log_list(customer_id,login_time,login_ip,login_type)VALUES(100,now(),1,10)

错误截图:

根据login_type 的值进行分区 p0存储login_type为 1,3,5,7,9;p1存储login_type为2,4,6,8的数据,而插入的数据的login_type为10,不包含在p0或p1的login_type范围中,所以插入失败,返回错误提示。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值