mysql8分区_mysql8中的表分区

  • Post author:
  • Post category:mysql


本文基于Mysql for windows 8.0.12版本

分表与表分区的区别:

分表

直接按照预定的规则, 把表拆分。业务操作时需要计算完成的表名。

分区

MySQL从5.1开始支持表的水平分区的。分区是将一个表或索引分解成多个更小,更可管理的部分。每个区都是独立的,可以独立处理,也可以作为一个更大对象的一部分进行处理。这个是MySQL支持的功能,业务代码无需改动。对于开发人员来说, 这是无感知的, 不需要关心数据库到底如何操作的。在ORM、Model中操作时比较方便。

mysql本身支持的主要的分区方式

有很多中间件,比如mycat, 支持分区, 分表, 读写分离, 故障转移等功能。

MySQL支持HASH分区、RANGE分区、LIST分区、KEY分区。

Hash分区:对用户定义的表达式所返回的值来进行分区。可以写partitions (分区数目),或直接使用分区语句,比如partition p0 values in…..。

Range分区:是对一个连续性的行值,按范围进行分区;比如:id小于100;id大于100小于200;

List分区:跟range分区类似,不过它存放的是一个离散值的集合。

Key分区:与hash分区类似,只不过分区支持一列或多列,并且MySQL服务器自身提供hash函数。

如果表存在主键或者唯一索引时,分区列必须是唯一索引的一个组成部分。

HASH分区

MYSQL支持两种HASH分区,常规HASH(HASH)和线性HASH(LINEAR HASH) 。

常规HASH

常规hash是基于分区个数的取模(%)运算。根据余数插入到指定的分区。

CREATE TABLE orders2(

order_id int unsigned NOT NULL AUTO_INCREMENT,

shop_id int unsigned NOT NULL,

amount decimal(10,2) NOT NULL,

primary key(order_id, shop_id) — 主键必须包含分区键

) engine=InnoDB PARTITION BY HASH(shop_id) PARTITIONS 10;

这个表中我们按店铺id对10取模来规划分区。

填充模拟数据:

— 填充模拟数据

DROP PROCEDURE IF EXISTS orders2_fill;

DELIMITER $$

CREATE PROCEDURE orders2_fill(in shop_id_from int, in count int)

BEGIN

DECLARE i int DEFAULT 0;

DECLARE shop_id1 int;

DECLARE shop_id2 int;

DECLARE shop_id3 int;

DECLARE shop_id4 int;

DECLARE shop_id5 int;

DECLARE amount1 decimal(10,2);

DECLARE amount2 decimal(10,2);

DECLARE amount3 decimal(10,2);

DECLARE amount4 decimal(10,2);

DECLARE amount5 decimal(10,2);

WHILE i < count DO

SET shop_id1 = shop_id_from + i * 5 + 0;

SET shop_id2 = shop_id_from + i * 5 + 1;



版权声明:本文为weixin_35867979原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。