MOD_HASH 分片算法规则
- 如果分片值的类型为字符串,则对字符串进行hash转换为数值类型。
- 当分库键和分表键是同键:
分表下标 = 分片值 % (分库数量 * 分表数量)
分库下标 = 分表下标 / 分表数量 - 当分库键和分表键不是同键:
分表下标 = 分片值 % 分表数量
分库下标 = 分片值 % 分库数量
- 当分库键和分表键是同键:
例:分片键相同的情况下
建库sql
create database mydb;
建表sql
CREATE TABLE orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 使用 mod_hash 分片算法,以 order_id 为分片键进行分片
DBPARTITION BY MOD_HASH(order_id)
TBPARTITION BY MOD_HASH(order_id)
-- 每个库中分配 1 个表
TBPARTITIONS 1
-- 分 3 个库 即 mydb_0、mydb_1、mydb_2
DBPARTITIONS 3;
- 当分片值为 101 时
- DBPARTITIONS 3 会创建 3 个库,即 mydb_0 、mydb_1 、mydb_2
TBPARTITIONS 1 每个库中会有一个分片表,即 mydb_0.orders_0、mydb_1.orders_1、mydb_2.orders_2 - 分表下标 = 101 % (3 * 1)= 2 -> 会被分配到 orders_2 中
- 分库下标 = 2 / 1 = 2 -> 会被分配到 mydb_2 中
- DBPARTITIONS 3 会创建 3 个库,即 mydb_0 、mydb_1 、mydb_2
其他章节 -> 跳转
end...