本文基于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;