以下大部分內(nèi)容非原創(chuàng)袭厂,整理自阿里云官方文檔
單庫單表
建一張單庫單表仁堪,不做任何拆分。
CREATE TABLE single_tbl(
id int,
name varchar(30),
primary key(id)
);
show topology from single_tbl;
CREATE TABLE normal_table(
id int,
name varchar(30),
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
分庫不分表
假設(shè)已經(jīng)建好的分庫數(shù)為 8打却,建一張表杉适,只分庫不分表,分庫方式為根據(jù) id 列哈希柳击。
CREATE TABLE multi_db_single_tbl(
id int,
name varchar(30),
primary key(id)
) dbpartition by hash(id);
show topology from multi_db_single_tbl;
分庫分表
使用哈希函數(shù)做拆分
CREATE TABLE multi_db_multi_tbl(
id int auto_increment,
bid int,
name varchar(30),
primary key(id)
) dbpartition by hash(id) tbpartition by hash(bid) tbpartitions 3;
show topology from multi_db_multi_tbl;
使用雙字段哈希函數(shù)做拆分
create table test_order_tb (
id int,
seller_id varchar(30) DEFAULT NULL,
buyer_id varchar(30) DEFAULT NULL,
create_time datetime DEFAULT NULL,
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by RANGE_HASH(seller_id,buyer_id, 10) tbpartition by RANGE_HASH(seller_id,buyer_id, 10) tbpartitions 3;
show topology from multi_db_multi_tbl;
使用日期做拆分
可以使用日期函數(shù) MM/DD/WEEK/MMDD 來作為分表的拆分算法
CREATE TABLE user_log(
userId int,
name varchar(30),
operation varchar(30),
actionDate DATE
) dbpartition by hash(userId) tbpartition by WEEK(actionDate) tbpartitions 7;
show topology from user_log;
CREATE TABLE user_log2(
userId int,
name varchar(30),
operation varchar(30),
actionDate DATE
) dbpartition by hash(userId) tbpartition by MM(actionDate) tbpartitions 12;
show topology from user_log2;
默認(rèn)使用主鍵作為拆分字段
當(dāng)拆分算法不指定任何拆分字段時猿推,系統(tǒng)默認(rèn)使用主鍵作為拆分字段。
CREATE TABLE prmkey_tbl(
id int,
name varchar(30),
primary key(id)
) dbpartition by hash();
CREATE TABLE prmkey_multi_tbl(
id int,
name varchar(30),
primary key(id)
) dbpartition by hash() tbpartition by hash() tbpartitions 3;
廣播表
子句BROADCAST用來指定創(chuàng)建廣播表。廣播表是指將這個表復(fù)制到每個分庫上蹬叭,在分庫上通過同步機制實現(xiàn)數(shù)據(jù)一致藕咏,有秒級延遲。
這樣做的好處是可以將 JOIN 操作下推到底層的 RDS(MySQL)秽五,來避免跨庫 JOIN孽查。
CREATE TABLE brd_tbl(
id int,
name varchar(30),
primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;
直接在客戶端使用DDL建表好像并不成功,盡量使用WEB控制臺建表
其它操作
查看物理表的拓?fù)浣Y(jié)構(gòu)
SHOW TOPOLOGY FROM multi_db_multi_tbl;
查看邏輯表是否創(chuàng)建成功
CHECK TABLE multi_db_multi_tbl;