MySQL拆分算法主要有两种类型:垂直分区和水平分区。垂直分区使用列来分割数据,也就是将一张表按照列信息分解到不同的数据源中。这种分区方法是将不同的数据写入不同的表中,实现了数据不同表的分离。水平分区使用行来分割数据,也就是将一张表按照行信息分隔成不同的数据源中。这种分区方法是将相同的数据中的不同的行写入不同的表中。
/*水平分区代码示例*/
-- 创建原始表
CREATE TABLE orders (
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) NOT NULL,
amount decimal(10,2) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建订单表1,包含部分订单数据
CREATE TABLE orders_001 (
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) NOT NULL,
amount decimal(10,2) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建订单表2,包含部分订单数据
CREATE TABLE orders_002 (
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) NOT NULL,
amount decimal(10,2) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 将数据拆分到不同的表中
INSERT INTO orders_001 SELECT * FROM orders WHERE id % 2 = 0;
INSERT INTO orders_002 SELECT * FROM orders WHERE id % 2 != 0;
通过水平分区,大家按照id的奇偶性将订单表的数据平均划分到了两个数据源(orders_001,orders_002)中,这样就避免了一个数据源中数据过多的问题,实现了数据的分割和分离。
/*垂直分区代码示例*/
-- 创建原始表
CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255) NOT NULL,
password varchar(255) NOT NULL,
email varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建用户表1,包含用户名和密码
CREATE TABLE users_001 (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255) NOT NULL,
password varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建用户表2,包含用户名和邮箱
CREATE TABLE users_002 (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255) NOT NULL,
email varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 将数据拆分到不同的表中
INSERT INTO users_001 SELECT id, username, password FROM users;
INSERT INTO users_002 SELECT id, username, email FROM users;
通过垂直分区,大家按照列的不同将用户表的数据分解为不同的数据源(users_001,users_002)中,这样就避免了一张表中数据列过多的问题,实现了数据的分割和分离。